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
Committer:
marcel1691
Date:
Mon Mar 23 17:31:18 2015 +0000
Revision:
1:6707f1145eca
Parent:
0:89cab3b9ea6e
.

Who changed what in which revision?

UserRevisionLine numberNew 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 */