Show Posts
Pages: 1 2 3 [4] 5 6 ... 8
46  International / Tutoriels et cours / Re: Simple "Serial_Com" arduino raspberry pi on: February 27, 2013, 03:55:55 pm

Raspberry pi =
Code:
# -*- coding: cp1252 -*-

#programme qui envoi  un msg sur le port serie a destination
#d'une carte arduino qui elle attend ce msg pour declencher
#une action et renvoi sur le port serie un accuser de reception
#exemple d' envoi de data vers arduino = send_data_to_arduino("donne_teleinfo")

import serial
import time #fonction heure_date + chrono
import threading #utilisation multi-threading

#########################################################################
##########                      Class                          ##########
#########################################################################

class Serial_Port_Watcher(threading.Thread): #thread qui li le port serie

   
    def __init__(self):
        threading.Thread.__init__(self)
        self.running = False#continu ou stop le thread
        self.accuser_de_reception = False#stop les tentative d'envoi de msg si bien reçut
       
    def run(self):
        self.running = True
        while self.running:# scrutation du buffer d'entree

            try:
                if serial_port.inWaiting():#inWaiting vient de "pyserial"
                    li_data_port_com()#appel la foction qui lit et verifie les datas
            except:
                pass
           
    def stop(self):
        self.running = False


###########################################################################
#############                    Fonctions                 ################
###########################################################################

def li_data_port_com():
       
    global msg_port_serie
       
    msg_port_serie = serial_port.readline()
    if (msg_port_serie != ""):
        msg_port_serie = msg_port_serie.rstrip() #on enleve le "\n" et le char null
        #print("msg => " + msg_port_serie) #debug du msg recu
       
        if(msg_port_serie.startswith("<") & msg_port_serie.endswith(">")): #on verifie l' integrité du msg (commence et fini par les balises "<...>"
            msg_is_ok(msg_port_serie) #appel la fonction de traitement du msg si celui ci et "entier"
           
        else:
            print("Erreur lecture port com = " + msg_port_serie)
            #log_serial_data("Erreur lecture port com = " + msg_port_serie)

    #serial_port.flushInput()
    #serial_port.flushOutput()

########################

def msg_is_ok(msg_ok):
#gestion des data recut sur le port serie (Arduino "UNO")
   
    print("RX serial port => " + msg_ok)#debug

    if (msg_ok != "<ok>"):
        send_accuser_de_reception()#vu que le msg est entier (et != accuser de reception venant de arduino) on accuse reception
       
    if (msg_ok == "<ok>"):
        data_watcher.accuser_de_reception = True#stop le ré-envoi du msg
        print("RX serial port => accuser de reception")
       
########################
         
def send_data_to_arduino(data_to_send):
#fonction qui envoi des data sur le port serie,attend un accuser de reception (string "ok")
#si pas reçu recommence l'envoi des meme data et cela un nombre de fois defini(variable "try_to_send")
    data_watcher.accuser_de_reception = False
    try_to_send = 0#raz nombre de tentative d'envoi des data

    while(try_to_send < 5):#boucle de tentative d'envoi retente jusqu'a x fois
       
        serial_port.write("<" + data_to_send + ">")
        try_to_send += 1 #incremente le nombre de tentative
        print("TX ok... try_to_send = " + str(try_to_send))
        time.sleep(1)#laisse le temps de recevoir accuser de recption

        if (data_watcher.accuser_de_reception == True):
            return#sort de la fonction si le msg est bien envoyer

########################

def send_accuser_de_reception():
    serial_port.write("<ok>")#envoi accuse reception
    print("TX serial port => accuser de reception")

########################

def connexion_arduino():

    global etat_connexion_arduino
    global serial_port

    try:
        serial_port = serial.Serial("COM3")#("/dev/ttyUSB0")
        serial_port.baudrate=9600
        etat_connexion_arduino = True
        print("connexion arduino ok")
       
    except:
        etat_connexion_arduino = False
        print("Erreur connexion arduino")
        pass
 
########################

def date():

    if time.localtime().tm_mday < 10 :
        day = str(0) + str(time.localtime().tm_mday)
    else:
        day = str(time.localtime().tm_mday)
       
    if time.localtime().tm_mon < 10:
        mon = str(0) + str(time.localtime().tm_mon)
    else:
        mon = str(time.localtime().tm_mon)

    date = day + "/" + mon + "/" + str(time.localtime().tm_year)
    return date

########################

def heure():
   
    if time.localtime().tm_hour < 10 :
        hh = str(0) + str(time.localtime().tm_hour)
    else:
        hh = str(time.localtime().tm_hour)
       
    if time.localtime().tm_min < 10:
        mm = str(0) + str(time.localtime().tm_min)
    else:
        mm = str(time.localtime().tm_min)

    if time.localtime().tm_sec < 10:
        sec = str(0) + str(time.localtime().tm_sec)
    else:
        sec = str(time.localtime().tm_sec)
                 
    heure = hh + ":" + mm + ":" + sec
    return heure

 
########################

def stop_prog():
   
    data_watcher.stop()
    serial_port.close()#ferme port ouvert dans connexion ardino
    print("stop programme")

#########################################################################
##########                       Main                          ##########
#########################################################################

print("Demarrage programme")
connexion_arduino()

#initialyse les objets
data_watcher = Serial_Port_Watcher()

#démarre les threads
data_watcher.start()

time.sleep(15)#tempo auto stop a virer dans votre prog
stop_prog()
47  International / Tutoriels et cours / Simple "Serial_Com" arduino raspberry pi on: February 27, 2013, 03:53:46 pm
Bonjour a tous,
voila je partage mon protocole de communication entre arduino et raspberry pi.
Deux petits scripts bien commenté pour aider les novices...
- Python 2.7 et lib "Serial" coté raspi
- IDE arduino 1.0.3
Code pas ou peu optimisé, pas de bug majeur mais, vos remarques seront les bien venu.
Par exemple le cpu de la raspberry mouline plein pot smiley-mr-green si quelqu'un a une solution...

Principe :
- carte arduino et raspberry pi relier par câble usb.
- les scripts intègre dans leur boucle une fonction qui li le port série, stocke les msg vérifie leur intégrité (simple présence de "char" spécifiques au début et a la fin, il faudrait faire un checksum...)
- si le msg est entier envoi un accuser de réception (sinon l' émetteur recommence l'envoi un max de 5 fois avant abandon)
- exécute une action en fonction du msg reçu

Ici les msg entre cartes sont de type "String".
Le script python contient une fonction date_time pour un fichier log que je vous épargne.

Arduino =
Code:
/*programme qui envoi  un msg sur le port serie a destination
d'une carte raspberry pi qui elle attend ce msg pour declencher
une action et renvoi sur le port serie un accuser de reception
send_data_to_raspi("donne_teleinfo") #exemple d' envoi de data vers raspberry
*/
//##############################
//variable data port serie
char data_port_serie = '\0';//char de reception "serial.read()"
char data[256] = "";//tableau de stockage des char reçu par le port serie
String str_data_serial;//data recu transformer en string
int i = 0;//incremente le tableau de char
boolean accuser_de_reception = false;//etat de l'accuser de recption
//##############################
//variable chronos attente accuser de reception
unsigned long start_chrono;
unsigned long stop_chrono;
unsigned long total_chrono;
//###############################################################
//###############################################################
//###############################################################

void setup()
{
  Serial.begin(9600);  
  Serial.println("Demarrage programme");
}//fin setup
//###############################################################
void loop()
{
  
  serial_port_watcher();//li les data du port serie(raspi) si data dispo
  
}//fin loop
//###############################################################
void serial_port_watcher()
{
  memset(data,0,256);//vide le tableau des data precedents
  str_data_serial = "";//raz du string data reçu
  i=0;
  
  if (Serial.available())//attend reception data
    
   {
     delay(100); //important! laisse le temps de charger le buffer          
     while (Serial.available() > 0) //tant qu' il ya des data en reception
       {
          data_port_serie = Serial.read();//stock dans une varible chaque char reçu
          data[i++] = data_port_serie;//on ajoute au tableau les char reçu
       }
    
     data[i++] = '\0';//on fini le tableau par un char nul pour construire un string
     str_data_serial = data;//transforme le tableau en string  
    
   }//fin if serial.avaible
 
 //#####################
 //verifi l'integrité du msg
   if (str_data_serial.startsWith("<") and str_data_serial.endsWith(">"))
    {
     //#####################
       //execute en fonction du msg reçu
       if (str_data_serial == "<donne_teleinfo>")
        {
          send_accuser_de_reception();//envoi accuser de reception
          //action ...
        }
       else if (str_data_serial == "<ok>")
        {
          accuser_de_reception = true;
        }
     }//fin de if startsWith...
//#####################
}//fin serial_port_watcher
//###############################################################
void send_data_to_raspi(String data_to_send)
{
  //fonction qui envoi des data sur le port serie,attend un accuser de reception (string "ok")
  //si pas reçu recommence l'envoi des meme data et cela un nombre de fois defini(variable "try_to_send")
  
  accuser_de_reception = false;
  long interval = 1000;//temps d'attende pour renvoi des data si pas de reponse accuser de reception
  byte try_to_send = 0;//nombre de tentative d'envoi des data
    
    while(try_to_send < 5)//boucle de tentative d'envoi retente jusqu'a x fois
      {
        
        start_chrono = millis();//demarre un chrono pour attente rx
        ++ try_to_send;//incremente le nombre de tentative
      
        Serial.println("<" +data_to_send+ ">");//envoi du msg(string passer en parametre) avec ajout des balises de debut et fin du msg pour verifier son integrité a la reception
        
         while (1)//attente reception de data pour accuser reception
           {
              //####################
              //li le port serie pour rx l'accuser de recep du raspi ("ok")
              serial_port_watcher();
              if(accuser_de_reception == true)
                {
                  return;//sort de la fonction si accuser de reception
                }
             //####################
             //verifie si le temps d'attente de reponse est depasser
             stop_chrono = millis();
             if(stop_chrono - start_chrono > interval)
             {
               break;//si temps d'attente accuser de reception ecouler on sort de la boucle pour re envoyer le msg
             }  
               //####################
           }//fin  while 1 (boucle attente reception accuser de reception)

      }//fin boucle de tentative d'envoi
            
}//fin ecrit data raspi
//###############################################################
void send_accuser_de_reception()
{
  Serial.println("<ok>");
}
//##########################################################################################

Je met le script raspberry dans le post suivant car "The message exceeds the maximum allowed length (9500 characters). "
48  International / Français / Re: Problème dans mon code et debug Serial impossible on: February 08, 2013, 06:56:58 am
Sinon avec une pin de libre et un kit RX TX 433 Mhz tu envoi tes paramètres a debuger sur une autre carte... mais la tu va me dire " j'ai pas de module 433 Mhz", et la moi je vais te répondre : "il va bien falloir que tu investisse 10 euros soit dans l'un soit dans l'autre" (433 Mhz ou LCD) car depuis le temps tu les aurais déjà reçu...  smiley-lol
Trêve de plaisanterie, bon courage pour passer par le soft...
49  International / Français / Re: Problème dans mon code et debug Serial impossible on: February 07, 2013, 06:01:11 pm
Bonjour,
si il te reste des pins de libre debug sur un lcd I2c ou SPI.
50  International / Français / Re: Raspberry <-> Arduino on: December 04, 2012, 06:16:24 pm
Bonjour, je suis en plein dedans (com entre Ras_pi et Uno)
le plus simple pour débuter c'est une simple liaison usb et un script python  qui lit et écrit sur le port série.
Ensuite a toi de développer un protocole de com entre les deux ...

Pour te lancer = http://www.doctormonk.com/2012/04/raspberry-pi-and-arduino.html
51  International / Français / Re: Communication avec le pc on: November 25, 2012, 03:08:44 am
Bonjour, ou alors utilise le port série :
Coté pc tu développe une application qui li le port com (celui qui relie ta carte arduino par usb).
Barbudor a fais un très bon tuto bien complet :
http://arduino.cc/forum/index.php/topic,102540.0.html
52  International / Tutoriels et cours / Re: [Tuto] Implémenter un protocole de communication on: November 20, 2012, 03:21:03 pm
Bonjour, merci et félicitations pour ton tuto, j'y retrouve les élément auxquels je me suis heurté en développent un protocole de communication a base de module 433Mhz.
Et d'autres que je n'avais pas pris en compte.
Grâce a toi je vais améliorer tout ça!!
53  International / Français / Re: [Résolu] Clone "Nano V3.0" form china ....marche pas :-( on: November 11, 2012, 02:39:49 pm
Moi ça m’étonne qu'a moitie ...
Pour les faire a ce prix la ils doivent pas y passer trop de temps  smiley-roll
Esperons qu'elles n' explosent trop vite  smiley-eek
54  International / Français / Re: [Résolut] Clone "Nano V3.0" form china ....marche pas :-( on: November 09, 2012, 07:43:08 pm
Probleme solved ! smiley-cool
A force de batailler...
Il me manquer le bootloader sur les cartes! J'ai suivit le tuto (le premier) = http://arduino.cc/en/Tutorial/ArduinoISP
Résultat Bootloader injecter dans les nanos et tout fonctionne bien.
Merci a ....
55  International / Français / [Résolu] Clone "Nano V3.0" form china ....marche pas :-( on: November 09, 2012, 05:06:42 pm
Bonjour a tous.
Voila petit souci avec des clones de nano V3.0 acheter sur dx =
http://dx.com/p/arduino-nano-v3-0-81877?item=30
reçu 1 mois plus tard, bien content au déballage mais vite déçu en testant !  smiley-fat
j'ai pris 2 cartes et aucune ne fonctionne(ce qui me fais penser que le problème vient de moi !) : les drivers s'installent ( différa-ment que sur ma nano officielle mais ils s'installent),la carte est reconnu au port com 4, et au moment d'uploader un "Blink" pour tester ... j' obtient le fameux => "avrdude: stk500_getsync(): not in sync: resp=0x00"
J'ai fais pas mal de recherches, pas mal de tests... je bloque.
Les 2 cartes ont le même problème, alors que ma nano officielle est reconnue et tourne bien.
Testes effectuer sous seven 32 (config propre pour ne pas être polluer par les autre drivers "uno ..." ,config normale.., xp, aurduino 0017,1.01,0023), rien a faire  smiley-cry
Impossible d'uploader.
Quelqu'un a une idée une piste, déjà vu le problème( j'en ai trouver pas mal sur le net, mais pas trop de soluce pour moi)
Un autre moyen d'uploader (avec une autre carte)?
Merci d'avance a ceux qui voudrons bien m'aider.
56  International / Français / Re: réguler 220v grace à l'arduino on: October 15, 2012, 12:51:16 pm
Ouai, synoptiquement parlant c'est ca  smiley-slim
Après tu devrais plutôt nous faire un schéma de câblage filaire qu'on vérifie bien ...
57  International / Français / Re: réguler 220v grace à l'arduino on: October 15, 2012, 05:55:36 am
Bonjour, il te faut un variateur de tension avec commande analogique  =
http://www.gotronic.fr/art-kit-k8064-910.htm
Tu fais varié ta tension alternative en fonction de la tension cc en entrée du module.
Pour faire varié une tension de 0 a 12 Vcc avec une carte uno, il te faut = un TIP122 et une alim 12vcc
Tu module un signal PMW sur le TIP122 qui va te faire varier la tension d'entré (12 Vcc)
Recherche sur le net ... genre la = http://www.ecs.umass.edu/ece/m5/tutorials/tip122_transistor_tutorial.html
A plus smiley-wink
58  International / Français / Re: Convertir un arrray on: September 03, 2012, 11:40:01 am
Je te remercie pour ton aide, cela fonctionne très bien.
Merci aussi a skywood pour le petit court c'est toujours bon a prendre!
Code:
void mesure_bat(){
float echelle = 0.0195503421309873;//=20/1023 car 20 Vcc maxi pour 1023 pas
val_A4 = (analogRead(A4))* echelle; 
char buf_tampon[64];
strcpy( buf_tampon, "bat_duino=" );
dtostrf( val_A4, 5, 2, buf_tampon+10 );
RedFly.socketSend(hTCP, (uint8_t*)buf_tampon,64 ); //send data to TCP socket
}
59  International / Français / Re: Convertir un arrray on: September 02, 2012, 04:51:42 pm
Alors je dois pas etre tres bon ou j'ai loupé quelque chose?
j"arrive bien a transmetre mais du cote reception j'obtien =
Code:
bat_duino=?
et meme en debugant avec le teminal =
Code:
bat_duino=?+des caracteres bizar
Voila ma fonction complete =
Code:
void mesure_bat(){
uint8_t* buf_bat;   
float echelle = 0.0195503421309873;//=20/1023 car 20 Vcc maxi pour 1023 pas
val_A4 = (analogRead(A4))* echelle; 
char buf_tampon[64];
sprintf( buf_tampon, "bat_duino=%f", val_A4 );
buf_bat = (uint8_t*)buf_tampon;
RedFly.socketSend(hTCP, buf_bat,64 ); //send data to TCP socket
}

 smiley-sad Qu'est ce qui ne va pas ?
60  International / Français / Re: Convertir un arrray on: September 02, 2012, 12:28:54 pm
merci pour ta réponse.
le float en int car je connaissais un la fonction itoa, pour me rapprocher du format désiré...
Mais si je reste en float c'est encore mieux!
Je teste le cast ce soir et je te tient au courant.
Merci.
Pages: 1 2 3 [4] 5 6 ... 8