Frage nur, weil im Datenblatt für den Transreceiver 4,5-5,5V als Versorgungsspannung angegeben sind. Theoretisch könnte man ja Rx und Tx mit Levelschiftern versehen und den MCP2551 mit 5V von Pi versorgen.
Grüße,
Daniel
Schaut ruhig mal auf meiner Homepage vorbei :
http://kampis-elektroecke.de
Oder folge mir auf Google+:
Daniel Kampert
Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.
Gruß
Daniel
Hmm, ich hab mir jetzt erst einmal einen CAN-Transceiver von Maxim bestellt. Der arbeitet auch beim 3,3V. Mit einem Gedanken bzgl. Slave habe ich auch gespielt, allerdings braucht man dazu ja auch kein RasPi sondern da täte es ja auch jeder beliebige Rechner.
Wollte eher im Userspace per Daemon, Daten via CAN und Funk einsammeln/verschicken und entweder mit dem Pi dann als Webinterface darstellen oder via Socket nach draußen pusten. Mal sehen eventuell auch beides.
Grüße,
Daniel
Ja genau sowas habe ich mir auch vorgestellt.
Das Pi soll dann halt als Zentrale für die Knoten dienen und ein Webinterface usw. bereit stellen.
Schaut ruhig mal auf meiner Homepage vorbei :
http://kampis-elektroecke.de
Oder folge mir auf Google+:
Daniel Kampert
Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.
Gruß
Daniel
Wenn am Anfang und / oder am Ende der Übertragung Raspi<>AVR Murks ankommt, in der Mitte der Übertragung die Daten jedoch komplett sind, hilft als Workaround auch ein eigenes Protokoll. Z.B. Zum Start mehrmals ein CHR( senden, welche die Gegenstelle immer als "Jetzt kommen neue Daten" versteht und am Ende der Übertragung ein CHR(9) und der Empfänger weiß dann: Datensatz vollständig und verarbeitet diesen und ignoriert alles, bis zum nächsten CHR(.
Messwerte müssten dann halt z.B. als String übertragen werden.
Z.B. so (nicht getesteter angepasster Code meiner Empfangsroutine):
Den Gegenpart Raspi>>AVR kann man genauso lösen. Da weiß ich aber nicht, welche Programmiersprache du nutzt.Code:// Compile with: GCC /var/scripte/empfangen.c -o /var/scripte/empfangen #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <termios.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <time.h> #define BAUDRATE B19200 char MODEMDEVICE[]= "/dev/ttyAMA0"; // Schnittstelle char eingang[255]=""; //Empfangenes int anzahl=0; //Anzahl Einträge in der Senderliste int laenge=0; //Anzahl empfangener Zeichen int fd; // UART File descriptor struct termios newtio={}; char WEBDEVICE[]="/tmp/webif.daten"; //Datei, wo die Empfangenen Daten abgespeichert werden, um sie dann per php auszulesen unsigned char eingangleer() //Eingang nullen { int i; for(i=0; i < laenge; i++){ eingang[i] = 0; } strcpy(eingang,""); laenge==0; c=0; } unsigned char receive() //Zeichen empfangen { int res; unsigned char buffer; res = read(fd, &buffer, 1); return buffer; } unsigned char auswerten() { int fd1; char ret; if ((strcmp(eingang,"resetreset") ==0 )){ system("reboot"); }else{ /* Zum Schreiben öffnen */ if (laenge > 0){ // F fd1 = open (WEBDEVICE, O_WRONLY|O_CREAT|O_TRUNC); //|O_TRUNC, S_IRUSR|S_IWUSR if (fd1 == -1) exit (-1); write (fd1, eingang, laenge); close (fd1); system("chmod 644 /tmp/webif.daten"); } } } int init() { /*** Init ***/ //O_RDONLY, O_WRONLY or O_RDWR - //O_NDELAY (geht weiter, wenn keine Daten da sind und gibt "-1" zurueck) // man 2 open fuer mehr Infos - see "man 2 open" for more info // O_NOCTTY No ControllTeleType /*fd1 = open(FILEDEVICE, O_WRONLY); if (fd1 < 0){ printf("Fehler beim oeffnen von %s\n", FILEDEVICE); exit(-1); }*/ fd = open(MODEMDEVICE, O_RDONLY | O_NOCTTY); if (fd < 0){ printf("Fehler beim oeffnen von %s\n", MODEMDEVICE); exit(-1); } memset(&newtio, 0, sizeof(newtio)); newtio.c_cflag = BAUDRATE | CS8 | CLOCAL | CREAD; //setzt die neuen Porteinstellungen newtio.c_iflag = IGNPAR; newtio.c_oflag = 0; newtio.c_lflag = 0; /* set input mode (non-canonical, no echo, ...) */ newtio.c_cc[VTIME] = 0; /* inter-character timer unused */ newtio.c_cc[VMIN] = 1; /* blocking read until 1 chars received */ tcflush(fd, TCIFLUSH); tcsetattr(fd, TCSANOW, &newtio); return fd; } int main(int argc, char** argv) { char c; int empfang=0; init(); while (1) { c=receive(); if(c==8){ //Init-Zeichen >> Neuer Befehl trifft ein strcpy(eingang,""); eingangleer(); empfang=1; } if (empfang==1){ if((c==9)){ //Ende-Zeichen >> Datensatz fertig >> Auswerten auswerten(); empfang=0; eingangleer(); }else if(c>13&&c<128&&laenge<255){ //Keine Sonderzeichen nur ASCII Standard eingang[laenge]=c; //empfangenes Zeichen anhängen laenge++; } } } close (fd); return 0; }
Geändert von peterfido (27.11.2012 um 17:40 Uhr)
Wenn das Herz involviert ist, steht die Logik außen vor! \/
Hey,
danke für den Tipp.
Ich denke mal um sowas werde ich auch nicht herum kommen. Ich finde einfach nicht die Ursache für das Problem....
Aber im Moment habe ich sowieso keine Zeit/Lust daran weiter zu basteln....
- - - Aktualisiert - - -
Hey,
ich habe das Problem mit dem UART gelöst....ich habe heute mal die Baudraten durchprobiert und festgestellt, dass es bei 9600 Baud nicht mehr auftritt.
Damit ist die Ausgabe langer Texte zwar zu langsam, aber für meinen CAN-Adapter für das Raspberry Pi habe ich mir eh einen Mega128 ausgeguckt und der hat 2x UART....dann nehme ich einmal einen mit 9600 Baud für die Kommunikation mit dem Pi, wo ich dann nur kurze Befehle sende und den anderen mit 115200 Baud für die Kommunikation mit dem PC....sollte denk ich mal so klappen :/
Geändert von Kampi (27.11.2012 um 20:29 Uhr)
Schaut ruhig mal auf meiner Homepage vorbei :
http://kampis-elektroecke.de
Oder folge mir auf Google+:
Daniel Kampert
Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.
Gruß
Daniel
Heyho,
meine Versuche mit dem Empfangen über UART klappen schon mal ganz gut (dank dem Beispiel von Peterfido).
Ich benutze zum Öffnen der temporäre Datei nun diesen Befehl:
File1 = open(FILEDEVICE, O_WRONLY | O_CREAT | O_APPEND);
Dadurch wird bei einem Enter der Text ans Ende der Datei angehängt, da die UART Ausgabe meines Knotens mehrere CRs besitzt.
Wie bekomme ich es nun hin, dass das CR + LF auch in der Textdatei erscheint?
Muss ich da einfach nur ein CR + LF in die Datei schreiben?
Kleiner Edit:
Die Kommunikation zwischen Pi und CAN-Bus klappt. Das Empfangsprogramm wird nun bei jedem Bootvorgang gestartet, lauscht und per Web kann das Empfangene ausgelesen werden (allerdings stimmt die Formatierung noch nicht ^.^).
Geändert von Kampi (30.11.2012 um 18:25 Uhr)
Schaut ruhig mal auf meiner Homepage vorbei :
http://kampis-elektroecke.de
Oder folge mir auf Google+:
Daniel Kampert
Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.
Gruß
Daniel
Soll heißen, dass sich die Frage mit dem CR+LF erledigt hat? Hab letzte Woche Freitag auch mein Pi bekommen. Momentan funkt es mit einem RFM12-Modul (per Mega328 und USB/RS232-Wandler). Pustet mir die Daten auch via Ethernet raus und ich kann von jedem PC im Heimnetz die Daten auslesen.
Grüße,
Daniel
Nein die Frage mit dem CR+LF hat sich noch nicht erledigt
Aber ein Funkmodul an dem Pi ist auch ne tolle Idee.....ich hab noch ein Bluetoothmodul hier rumliegen
Hab auch schon ein bisschen an meiner Adapterplatine rumdesigned und da packe ich glaube ich auch noch ein BTM222 drauf ^.^
Muss nur gucken wie ich das mit der Pegelwandlung mache.....im Grunde kommuniziert der Mega128 Slave nur über UART mit dem Pi. Von daher brauche ich ja nur zwei Pins auf einen höheren Pegel bringen.....naja mal schauen ^.^
Edit:
Ok das mit dem CR + LF hat sich nun erledigt.
Das ganze sieht nun so aus (ist nur noch ein LF zuviel drin):
Bild hier
Die Frage ist jetzt nur warum kann ich durch einen Klick auf "Löschen" nicht die Datei löschen?
Der PHP Code sieht so aus:
Und weißt du wie ich das Textfeld auf der PHP Seite fixieren kann? Im Moment kann ich das Feld noch auseinander ziehen. Nur das würde ich gerne anders lösen.Code:if (isset($_REQUEST["Löschen"])) { shell_exec("sudo rm /tmp/UART_Empfang.txt"); };
Geändert von Kampi (30.11.2012 um 22:07 Uhr)
Schaut ruhig mal auf meiner Homepage vorbei :
http://kampis-elektroecke.de
Oder folge mir auf Google+:
Daniel Kampert
Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.
Gruß
Daniel
hmm BTM ist langweilig Da kannst du auch gleich nen USB-Dongle nehmen. Wenn du den Mega128 mit 5V betreiben willst, könnte die Pegelwandlung wie bei dem BTM-Mini-S von robotrack realisieren. Ansonsten halt 3,3V und nen CAN-Transceiver von Maxim nehmen. Die können mit 3,3V und CAN-Pegel von 5 und 12 V verarbeiten. Liegen bei mir auf Arbeit in der Post .
Grüße,
Daniel
Lesezeichen