mbed nach Arduino mittels I2C Bus
Dependencies: mbed
Arduino sind weit verbreitet und Verfügen, in der Regel, über keinen direkten Ethernet Anschluss. Mittels dem I2C Bus können bestehende Arduino in das Internet der Dinge eingebunden werden.
Das mbed Board übernimmt dabei die Verbindung zum Internet und die Feinverteilung der Aufgaben auf die Arduino's mittels dem I2C Bus.
Das nachfolgende Programm ermöglicht es einem mbed einen Arduino zu steuern. Dazu sind die Anschlüsse
- GND
- 5V
- SDA
- SCL 1:1 zu Verbinden und der Sketch in den Arduino zu laden.
Anwendungen
- Verbinden von Boards, über kleinere (1 Meter) oder grössere Distanzen. Siehe www.mikrokontroller.net und RocNet
- Verbindung mbed mit Arduino
main.cpp@1:6707f1145eca, 2015-03-23 (annotated)
- Committer:
- marcel1691
- Date:
- Mon Mar 23 17:31:18 2015 +0000
- Revision:
- 1:6707f1145eca
- Parent:
- 0:89cab3b9ea6e
.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
marcel1691 | 0:89cab3b9ea6e | 1 | /** mbed nach Arduino mittels I2C Bus |
marcel1691 | 0:89cab3b9ea6e | 2 | Arduino Sketch siehe Kommentar am Schluss |
marcel1691 | 0:89cab3b9ea6e | 3 | */ |
marcel1691 | 0:89cab3b9ea6e | 4 | #include "mbed.h" |
marcel1691 | 0:89cab3b9ea6e | 5 | |
marcel1691 | 0:89cab3b9ea6e | 6 | // I2C Master |
marcel1691 | 0:89cab3b9ea6e | 7 | I2C i2c( D14, D15 ); |
marcel1691 | 0:89cab3b9ea6e | 8 | |
marcel1691 | 0:89cab3b9ea6e | 9 | // CMD Buffer (cmd, addr, arg) |
marcel1691 | 0:89cab3b9ea6e | 10 | char cmd[4] = { 0x00, 0x00, 0x00, 0x00 }; |
marcel1691 | 0:89cab3b9ea6e | 11 | int slave = 0x10 << 1; |
marcel1691 | 0:89cab3b9ea6e | 12 | |
marcel1691 | 0:89cab3b9ea6e | 13 | int main() |
marcel1691 | 0:89cab3b9ea6e | 14 | { |
marcel1691 | 0:89cab3b9ea6e | 15 | printf ( "I2C Master Test\n" ); |
marcel1691 | 0:89cab3b9ea6e | 16 | |
marcel1691 | 0:89cab3b9ea6e | 17 | int status = 0; |
marcel1691 | 0:89cab3b9ea6e | 18 | while (1) |
marcel1691 | 0:89cab3b9ea6e | 19 | { |
marcel1691 | 0:89cab3b9ea6e | 20 | // write I2C |
marcel1691 | 0:89cab3b9ea6e | 21 | for ( int i = 4; i <= 7; i++ ) |
marcel1691 | 0:89cab3b9ea6e | 22 | { |
marcel1691 | 0:89cab3b9ea6e | 23 | cmd[0] = 'w'; |
marcel1691 | 0:89cab3b9ea6e | 24 | cmd[1] = i; |
marcel1691 | 0:89cab3b9ea6e | 25 | cmd[2] = 1; |
marcel1691 | 0:89cab3b9ea6e | 26 | printf( "write to %d, %d - ", slave, (int) cmd[2] ); |
marcel1691 | 0:89cab3b9ea6e | 27 | status = i2c.write( slave, cmd, 3 ); |
marcel1691 | 0:89cab3b9ea6e | 28 | printf("Status %d\n", status ); |
marcel1691 | 0:89cab3b9ea6e | 29 | wait( 1.0 ); |
marcel1691 | 0:89cab3b9ea6e | 30 | |
marcel1691 | 0:89cab3b9ea6e | 31 | cmd[0] = 'w'; |
marcel1691 | 0:89cab3b9ea6e | 32 | cmd[1] = i; |
marcel1691 | 0:89cab3b9ea6e | 33 | cmd[2] = 0; |
marcel1691 | 0:89cab3b9ea6e | 34 | printf( "write to %d, %d - ", slave, (int) cmd[2] ); |
marcel1691 | 0:89cab3b9ea6e | 35 | status = i2c.write( slave, cmd, 3 ); |
marcel1691 | 0:89cab3b9ea6e | 36 | printf("Status %d\n", status ); |
marcel1691 | 0:89cab3b9ea6e | 37 | wait( 1.0 ); |
marcel1691 | 0:89cab3b9ea6e | 38 | } |
marcel1691 | 0:89cab3b9ea6e | 39 | } |
marcel1691 | 0:89cab3b9ea6e | 40 | } |
marcel1691 | 0:89cab3b9ea6e | 41 | |
marcel1691 | 1:6707f1145eca | 42 | /** Arduino Sketch |
marcel1691 | 0:89cab3b9ea6e | 43 | |
marcel1691 | 0:89cab3b9ea6e | 44 | #include <Wire.h> |
marcel1691 | 0:89cab3b9ea6e | 45 | |
marcel1691 | 0:89cab3b9ea6e | 46 | byte buf[2]; // I/O Buffer |
marcel1691 | 0:89cab3b9ea6e | 47 | int a3; // Poti |
marcel1691 | 0:89cab3b9ea6e | 48 | |
marcel1691 | 0:89cab3b9ea6e | 49 | // I2C Empfangerfunktion |
marcel1691 | 0:89cab3b9ea6e | 50 | void receiveEvent(int howMany) |
marcel1691 | 0:89cab3b9ea6e | 51 | { |
marcel1691 | 0:89cab3b9ea6e | 52 | int cmd = Wire.read(); // Command (ignored) |
marcel1691 | 0:89cab3b9ea6e | 53 | int addr = Wire.read(); // Adresse |
marcel1691 | 0:89cab3b9ea6e | 54 | int value = Wire.read(); // Wert |
marcel1691 | 0:89cab3b9ea6e | 55 | |
marcel1691 | 0:89cab3b9ea6e | 56 | digitalWrite( addr, value ); |
marcel1691 | 0:89cab3b9ea6e | 57 | } |
marcel1691 | 0:89cab3b9ea6e | 58 | |
marcel1691 | 0:89cab3b9ea6e | 59 | // I2C Request i2c.read() abhandeln |
marcel1691 | 0:89cab3b9ea6e | 60 | void requestEvent() |
marcel1691 | 0:89cab3b9ea6e | 61 | { |
marcel1691 | 0:89cab3b9ea6e | 62 | buf[0] = a3 / 256; // hoeherwertiges Byte |
marcel1691 | 0:89cab3b9ea6e | 63 | buf[1] = a3 % 256; // niederwertiges Byte |
marcel1691 | 0:89cab3b9ea6e | 64 | Wire.write( buf, 2 ); |
marcel1691 | 0:89cab3b9ea6e | 65 | } |
marcel1691 | 0:89cab3b9ea6e | 66 | |
marcel1691 | 0:89cab3b9ea6e | 67 | // Initialiserierung |
marcel1691 | 0:89cab3b9ea6e | 68 | void setup() |
marcel1691 | 0:89cab3b9ea6e | 69 | { |
marcel1691 | 0:89cab3b9ea6e | 70 | Wire.begin( 0x10 ); // join i2c bus with address #10 |
marcel1691 | 0:89cab3b9ea6e | 71 | Wire.onReceive( receiveEvent ); // register event |
marcel1691 | 0:89cab3b9ea6e | 72 | Wire.onRequest( requestEvent ); |
marcel1691 | 0:89cab3b9ea6e | 73 | |
marcel1691 | 0:89cab3b9ea6e | 74 | pinMode( 4, OUTPUT ); |
marcel1691 | 0:89cab3b9ea6e | 75 | pinMode( 5, OUTPUT ); |
marcel1691 | 0:89cab3b9ea6e | 76 | pinMode( 6, OUTPUT ); |
marcel1691 | 0:89cab3b9ea6e | 77 | pinMode( 7, OUTPUT ); |
marcel1691 | 0:89cab3b9ea6e | 78 | |
marcel1691 | 0:89cab3b9ea6e | 79 | pinMode( A3, INPUT ); |
marcel1691 | 0:89cab3b9ea6e | 80 | |
marcel1691 | 0:89cab3b9ea6e | 81 | Serial.begin( 9600 ); |
marcel1691 | 0:89cab3b9ea6e | 82 | Serial.println( "ready\n" ); |
marcel1691 | 0:89cab3b9ea6e | 83 | } |
marcel1691 | 0:89cab3b9ea6e | 84 | |
marcel1691 | 0:89cab3b9ea6e | 85 | // Hauptprogramm |
marcel1691 | 0:89cab3b9ea6e | 86 | void loop() |
marcel1691 | 0:89cab3b9ea6e | 87 | { |
marcel1691 | 0:89cab3b9ea6e | 88 | a3 = analogRead( A3 ); |
marcel1691 | 0:89cab3b9ea6e | 89 | Serial.println( a3 ); |
marcel1691 | 0:89cab3b9ea6e | 90 | delay(1000); |
marcel1691 | 0:89cab3b9ea6e | 91 | |
marcel1691 | 0:89cab3b9ea6e | 92 | } |
marcel1691 | 0:89cab3b9ea6e | 93 | */ |