====== Kommunikations-Technologien ====== Hier werden unterschiedliche Kommunikations-Technologien zwischen Mikrocontrollern im Detail beschrieben. Die Informationen sollen als Auswahlhilfe und als Nachschlagewerk dienen. ===== Übersicht ===== ^ Name ^ Standard ^ Kabel(Anzahl) ^ Distanz ^ Synchron ^ Clock ^ Anzahl Partner ^ Bitrate ^ Endgeräte ^ Details ^ | Serial | UART | Kabel(3 GND,RX,TX) | 300m | Asynchron | Nein | max. 2 | 9600-250000 | Arduino,PIC32,Yun,PC| [[interface:start#serialuart|Serial UART]] | | RS485 | RS485 | Kabel(3/4) | | ? | ? | ? | ? | ? | [[interface:start#RS485|]] | | I2C/SPI | I2C/SPI | Kabel(4) | | ? | ? | ? | ? | ? | [[interface:start#I2CSPI|]] | | IP/Ethernet | IP/Ethernet | Wireless | ~100m (100BaseT) | n/a | n/a | 232 | 10-1000M | IP-fähig | [[interface:IP_Ethernet|Ethernet/IP]] | | BLE | Bluetooth Low Energy | Wireless | | ? | ? | ? | ? | ? | [[interface:start#BLE|]] | | Bluetooth | Bluetooth | Wireless | | ? | ? | ? | ? | ? | [[interface:start#Bluetooth|]] | | RFM12B/433 Mhz | RFM12B/433 Mhz | Wireless | 50-100m | | | 1-31 | 115kBit/s | Arduino mit RF Shield, RF Shield Mini Yun | [[interface:start#RFM12B433Mhz|]] | | Wlan/Wireless |Wlan/Wireless | Wireless | | ? | ? | ? | ? | ? | [[interface:start#WlanWireless|]] | ===== Details ===== ==== Serial UART ==== UART = Universal Asynchronous Receiver Transmitter Die serielle Verbindung ist eine Verbindung ohne Synchronisation (Asynchron) es gibt kein "Clock". Der Sender und Empfänger müssen die gleiche Bit Rate eingestellt haben. === Verbindung === Es können nur 2 Partner miteinander verbunden werden. Wir verbinden drei Kabel: Rx,Tx und GND {{:interface:serial_connection.png?}} === Signal === Logisch 1 bedeutet eine tiefe Spannung und Logisch 0 eine hohe Spannung. Wir unterscheiden Start/Stop Bit und die 8 Datenbits 0 bis 7. Das gibt dann 10 Bits. Die Geschwindigkeit wird über die Baud Rate festgelegt und muss beim Sender und Empfänger gleich eingestellt werden. Die Baudrate bedeutet Bits pro Sekunde. 9600 Bauds => 960 Bytes/Sekunde Hier in der Grafik ist das beispielhaft dargestellt, der Volt "Level" ist jedoch für RS 232 aufgezeigt mit +/- 15 Volt wäre das für TTL viel zu hoch. {{:interface:serial_rs232_oscilloscope_trace.svg.png|}} Quelle: http://wikipedia.org Es gibt unterschiedliche TTL Volt Levels welche zu beachten sind, hier eine Übersicht: {{:projekte:interface_serial-voltage-switching-levels-grpah.png?|}} Quelle: http://www.interfacebus.com === Spezielles === Die Serielle Verbindung ist schon sehr alt und wurde für das Fernschreibnetz entwickelt ( TTY = Teletype = Fernschreiber ). === Verwendung === Die Serielle Schnittstelle ist beim Arduino allgegenwärtig über Sie können wir den Arduino programmieren oder Informationen vom Programm über Serial.print im Serial Monitor auf dem Computer beobachten. Sie wird auch zur Verbindung zwischen dem Yun/Yun Shield und dem Arduino verwendet. {{:interface:yun_bridgeinshort.png}} Quelle: https://www.arduino.cc Auch die OpenWRT Systeme verfügen über einen UART Anschluss. Das OpenWRT System ist eine Linux Distribution für Embedded Systeme. Der [[http://shop.boxtec.ch/wrtnode-open-source-mini-openwrt-dev-board-p-42266.html|WrtNode]] ist ein preiswertes IoT Modul. Der OpenWrt verfügt über Wlan und Ethernet aber jetzt wollen wir Ihn mal direkt mit dem Computer verbinden. Das ist sehr hilfreich, wenn wir bei der Netzwerk- oder Firewall-Konfiguration Fehler gemacht haben und nicht mehr auf das Gerät zugreifen können. Dann kann man über die Serielle Verbindung immer noch zugreifen und die Fehler beheben. Dazu verwenden wir einen FTDI Adapter und 4 Dioden um von 5 Volt auf 3.3 Volt zu kommen. Natürlich kann auch ein "Level Shifter" eingesetzt werden. {{:projekte:20151002_220653.jpg?500|}} Auf dem Computer verwendet man am besten Putty. Einfach den COM Port vom FTDI Adaper und die Baud Rate 115200 eintragen und verbinden. {{:reviews/openwrtnode_serial_usb_serial_connect.png?|}} Wenn der WrtNode startet sieht man gleich auch Boot Informationen. Von hier aus könnte auch eine neue Firmware eingespielt werden. Hier einfach warten bis der Boot Vorgang vorbei ist. {{:projekte:wrtnode_boot.png?|}} Nachdem die keine neuen Bootmeldungen mehr erscheine einfach drücken und schon wird eine Konsole geöffnet mit welcher ganz normal gearbeitet werden kann. {{:projekte:wrtnode_boot_console.png?|}} == WrtNode mit HelvePic32 == Der WrtNode ist für die Verbindung mit Sensoren auf der Linux Seite nicht sehr gut ausgestattet. Es gibt kein Analoger Input Pin und es sind auch keine Libraries von Sensoren vorhanden. Analog zum Yun liegt es auch hier auf der Hand den OpenWrt mit einem Arduino zu verbinden. So hat man alle Vorteile der Arduino Welt und trotzdem ein Linux System zur Hand. = Anschluss = Wir verbinden folgende Leitungen ^ HelvePic32 ^ WRTNode ^ | UART1 TX | RXD2 Pin 7 | | UART2 RX | TXD2 Pin 8 | | GND | GND | Den Wrtnode und den HelvePic32 schliessen wir per USB an. {{:projekte:20151003_001827.jpg?500|}} Jetzt müssen wir noch die Baud Rate kontrollieren, beide Systeme müssen für die UART Schnittstelle die gleiche Baud Rate verwenden. Auf dem OpenWrt ist der UART von Pin 7 und 8 unter /dev/ttyS0 erreichbar. Um die Baud Rate zu kontrollieren auf dem WrtNode einfach folgenden Befehl eingeben: stty -F /dev/ttyS0 {{:reviews:wrtnode_stty.png?500|}} Hier oben ist ersichtlich dass wir mit 115200 Baud arbeiten. Diese Baud Rate verwenden wir weiter unten im HelvePic32 Programm. Falls es zu unsicheren Verbindungen oder unerklährlichen Fehler in der Verbindung kommt kann mit dem folgenden Befehl die Baudrate reduziert werden. Hier auf 9600 Baud. Achtung diese Einstellung wird beim erneuten Anschliessen der Kabel wieder auf den Standard zurückgesetzt. stty -F /dev/ttyS0 9600 Damit das ganze Sinn macht habe ich am HelvePic32 ein Lichtsensor angeschlossen, die Lichtstärke soll über den HelvePic32 zum WrtNode und dann auf einem Emoncms Server zur Auswertung übertragen werden. Hier die Codings: HelvePic32 int mil; char inChar = 0; int sensorPin = A7; int sensorValue = 0; String cmd; void setup() { Serial.begin(9600); // USB Serial Serial0.begin(9600); // UART 1 // Serial1.begin(115200); // UART 2 } void loop() { sensorValue = analogRead(sensorPin); Serial.print("Sensor : "); Serial.println(sensorValue); mil = millis() / 200; Serial.print("Request at: "); Serial.println(mil); Serial.print(" / Response: "); cmd = "python /root/emon.py 0 0 " + String(sensorValue); Serial0.println(cmd); while (Serial0.available() > 0) { // get incoming byte: inChar = Serial0.read(); Serial.print(inChar); } Serial.println(); delay(4000); } emon.py import sys, string, time import httplib ts = time.time() st = int(ts) print st domain = "emoncms.org" apikey = " hier api key eingeben " nodeid = 10 conn = httplib.HTTPConnection(domain) csv = sys.argv[1] + "," + sys.argv[2] + "," + sys.argv[3] conn.request("GET", "/input/post.json?apikey="+apikey+"&node="+str(nodeid)+"&csv="+csv+"&time="+str(st)) response = conn.getresponse() print response.read() Im Serial Monitor vom HelvePic32 kann man das Protokoll prüfen oder dann direkt in der Emoncms Instanz prüfen ob Messdaten angekommen sind. Natürlich macht eine Grafische Auswertung mehr Spass als nur die Zahlen. {{:projekte:wrtnode_sensor_emoncms.png?500|}} === Weitere Themen === Hier weitere Themen welche noch nicht behandelt wurden. * Software Serial * CTS/RTS "Ready to send" und "Clear to Send" === Links === * [[https://de.wikipedia.org/wiki/Universal_Asynchronous_Receiver_Transmitter|Wikipedia UART]] * [[https://www.arduino.cc/en/Reference/Serial|Arduino Serial Reference]] * [[https://learn.sparkfun.com/tutorials/serial-communication/all|Serial Tutorial at Sparkfun]] * [[https://playground.boxtec.ch/doku.php/reviews/wrtnode|WrtNode Review]] * [[http://www.tldp.org/HOWTO/html_single/Serial-HOWTO/ Ausführliches Nachschlagewerk zum Thema Serial Interface]] ==== RS485 ==== ==== I2C/SPI ==== ==== IP/Ethernet ==== ==== BLE ==== BLE oder Bluetooth Low Energy ==== Bluetooth ==== [[products:bluetooth_to_serial_port_module_hc-05|HC-05 Bluetooth Modul]] ==== RFM12B/433 Mhz ==== Der Transceiver [[http://shop.boxtec.ch/rfm12bsp-wireless-transceiver-434mhz-p-41953.html|RFM12B]] von HopeRF ist ein universeller Sender und Empfänger für die drahtlose Datenübertragung im 433/866/915 MHz-Bereich. Im Arduino-Umfeld wird dieser Transceiver hauptsächlich für drahtlose Sensor-Netzwerke verwendet. Bekannte Projekte sind JeeNode (http://jeelabs.net/projects/hardware/wiki/JeeNode) Openenergymonitor (http://openenergymonitor.org). ==== Wlan/Wireless ====