Änderungen

RaspberryGPIOSerial

3.063 Byte hinzugefügt, 13:41, 25. Jul. 2017
Die Seite wurde neu angelegt: „Man kann über die GPIO-Pins eine serielle Verbindung zu einem PC, Arduino, ... aufbauen um Daten auszutauschen oder Steuerinformationen zu übertragen.<br> …“
Man kann über die GPIO-Pins eine serielle Verbindung zu einem PC, Arduino, ... aufbauen um Daten auszutauschen oder Steuerinformationen zu übertragen.<br>
[[File:Raspi3_GPIO_Rxtx.PNG|150px]][https://pinout.xyz/pinout/]<br><br>
Zuerst muss die serielle login shell deaktiviert und die serielle Schnittstelle aktiviert werden.
<pre> sudo raspi-config </pre>
* 5. Interfacing Options
** P6 Serial<br>
*** Would you like a login shell to be accessible over serial? No<br>
*** Would you like the serial port hardware to be enabled? Yes<br>
<pre> sudo reboot </pre>
Schnittstelle mittels eines '''Terminals''' testen.<br>
Es gibt minicom oder cu und weitere.<br>

Wenn man die beiden pins 8(TX) und 10(RX) miteinander verbindet, kann man die Schnittstelle mit sich selbst testen.
Auf dem Terminal werden die Tastatureingaben als ein lokales Echo wiedergegeben.
<pre>sudo minicom -b 115200 -D /dev/ttyS0 (Verlassen über Strg+a, z, x)</pre>
oder
<pre>cu -l /dev/ttyS0 -s 115200 (Verlassen ~.)</pre>


Da die GPIO-Pins des Raspis mit 3.3V und der PC oder Arduino mit 5V Logic Level funktionieren müssen wir die Level convertieren.<br>
Da ein TX-Signal vom Raspi mit 3.3V im PC immer noch ein High ist brauchen wir hier nichts zu tuen.<br>
Das 5V TX-Signal vom PC zum Raspi würde aber den Pin zerstören. Hier reicht es aber einen Spannungsteiler zwischen zu schalten.<br>
[[File:SerialRaspiArduino.jpg]]

'''PC'''<br>
Hier ein Terminalprogramm wie Terminal von Br@y verwenden.

'''Arduino'''
<pre>
void setup() {
Serial.begin(9600);
}
void loop() {
if(Serial.available()) {
Serial.write(Serial.read());
}
}
</pre>
Und hier ein etwas komplexerer Kommandoparser:<br>
Die Kommandos sind a und b gefolgt von einem Integer wie z.B. ''a21''
<pre>
void receive_serial_cmd(void) {
static uint8_t cmd[18]; // command buffer
static uint8_t cmdcount = 0; // position in the buffer of the received byte
uint8_t c; // received byte
while(Serial.available()) {
c = Serial.read();
if(c > ' ') cmd[cmdcount++] = c;
if((c == 8) && (cmdcount > 0)) cmdcount--; // deals with backspaces, if a person on the other side types
if((c == 0x0d) || (c == 0x0a) || (cmdcount > 16)) { // end of command, gets interpreted now
cmd[cmdcount] = 0; // clear the last byte in cmd buffer
if(cmdcount > 0) { // prevent empty cmd buffer parsing
switch(cmd[0]) {
case 'a':
if((cmdcount > 2) && (cmdcount < 7)) {
int temp = atoi((const char *)&cmd[1]);
Serial.print("a:");
Serial.println(temp);
}
break;
case 'b':
if((cmdcount > 2) && (cmdcount < 7)) {
int temp = atoi((const char *)&cmd[1]);
Serial.print("b:");
Serial.println(temp);
}
break;
}
}
cmdcount = 0;
}
}
}
</pre>
688
Bearbeitungen