- LiTime Speicher und Akkus         
Seite 3 von 4 ErsteErste 1234 LetzteLetzte
Ergebnis 21 bis 30 von 37

Thema: Kommunikation zwischen CAN-Knoten und Raspberry

  1. #21
    Erfahrener Benutzer Roboter Experte Avatar von ePyx
    Registriert seit
    14.05.2008
    Ort
    Falkensee
    Beiträge
    700
    Anzeige

    LiFePo4 Akku selber bauen - Video
    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

  2. #22
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    34
    Beiträge
    3.501
    Blog-Einträge
    9
    Ja muss mal schauen wie ich das mache.
    Eine Aufsteckplatine ist bereits in Planung......nur der UART nervt mich noch ein bischen.
    Auf der Platine befindet sich dann ein Mega128 als Slave der Befehle per UART bekommt.
    Aber das ist im Moment erstmal nur eine Idee auf Papier
    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

  3. #23
    Erfahrener Benutzer Roboter Experte Avatar von ePyx
    Registriert seit
    14.05.2008
    Ort
    Falkensee
    Beiträge
    700
    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

  4. #24
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    34
    Beiträge
    3.501
    Blog-Einträge
    9
    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

  5. #25
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    18.05.2007
    Ort
    Berlin
    Alter
    52
    Beiträge
    765
    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):
    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;
    }
    Den Gegenpart Raspi>>AVR kann man genauso lösen. Da weiß ich aber nicht, welche Programmiersprache du nutzt.
    Geändert von peterfido (27.11.2012 um 17:40 Uhr)
    Wenn das Herz involviert ist, steht die Logik außen vor! \/

  6. #26
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    34
    Beiträge
    3.501
    Blog-Einträge
    9
    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

  7. #27
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    34
    Beiträge
    3.501
    Blog-Einträge
    9
    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

  8. #28
    Erfahrener Benutzer Roboter Experte Avatar von ePyx
    Registriert seit
    14.05.2008
    Ort
    Falkensee
    Beiträge
    700
    Zitat Zitat von Kampi Beitrag anzeigen
    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 ^.^).
    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

  9. #29
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    34
    Beiträge
    3.501
    Blog-Einträge
    9
    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:

    Code:
    if (isset($_REQUEST["Löschen"]))
    {
        shell_exec("sudo rm /tmp/UART_Empfang.txt");
    };
    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.
    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

  10. #30
    Erfahrener Benutzer Roboter Experte Avatar von ePyx
    Registriert seit
    14.05.2008
    Ort
    Falkensee
    Beiträge
    700
    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

Seite 3 von 4 ErsteErste 1234 LetzteLetzte

Ähnliche Themen

  1. [ERLEDIGT] Kommunikation AVR <-> Raspberry
    Von Goldenflash im Forum Raspberry Pi
    Antworten: 6
    Letzter Beitrag: 04.09.2012, 09:30
  2. SPI Kommunikation zwischen 2 AVR's
    Von Ruppi im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 7
    Letzter Beitrag: 05.07.2007, 10:34
  3. Kommunikation zwischen uP und Pc
    Von XC866 im Forum C - Programmierung (GCC u.a.)
    Antworten: 3
    Letzter Beitrag: 14.02.2007, 15:48
  4. Kommunikation zwischen PC und BOT
    Von corpsealive im Forum PC-, Pocket PC, Tablet PC, Smartphone oder Notebook
    Antworten: 9
    Letzter Beitrag: 07.07.2006, 07:40
  5. [ERLEDIGT] Kommunikation zwischen AVR und PC
    Von im Forum AVR Hardwarethemen
    Antworten: 8
    Letzter Beitrag: 10.02.2004, 13:26

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiTime Speicher und Akkus