- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 10 von 37

Thema: Kommunikation zwischen CAN-Knoten und Raspberry

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    35
    Beiträge
    3.501
    Blog-Einträge
    9
    Hey,

    ja ich hab schon drüber nachgedacht und sowas ist schon in Planung

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

  3. #3
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    35
    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

  4. #4
    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

  5. #5
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    35
    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

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    18.05.2007
    Ort
    Berlin
    Alter
    53
    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 16:40 Uhr)
    Wenn das Herz involviert ist, steht die Logik außen vor! \/

Ähnliche Themen

  1. [ERLEDIGT] Kommunikation AVR <-> Raspberry
    Von Goldenflash im Forum Raspberry Pi
    Antworten: 6
    Letzter Beitrag: 04.09.2012, 08:30
  2. SPI Kommunikation zwischen 2 AVR's
    Von Ruppi im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 7
    Letzter Beitrag: 05.07.2007, 09:34
  3. Kommunikation zwischen uP und Pc
    Von XC866 im Forum C - Programmierung (GCC u.a.)
    Antworten: 3
    Letzter Beitrag: 14.02.2007, 14: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, 06:40
  5. [ERLEDIGT] Kommunikation zwischen AVR und PC
    Von im Forum AVR Hardwarethemen
    Antworten: 8
    Letzter Beitrag: 10.02.2004, 12:26

Berechtigungen

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

12V Akku bauen