13_-_arduino_et_python
Différences
Ci-dessous, les différences entre deux révisions de la page.
Prochaine révision | Révision précédente | ||
13_-_arduino_et_python [2018/06/30 09:54] – créée mistert | 13_-_arduino_et_python [2020/09/26 15:15] (Version actuelle) – modification externe 127.0.0.1 | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
=== Arduino et Python === | === Arduino et Python === | ||
- | Disons le d' | + | Disons le d' |
**Le code Arduino** | **Le code Arduino** | ||
Ligne 79: | Ligne 79: | ||
+ | Le protocole d' | ||
+ | Il y a un code pour les différentes commandes. | ||
+ | #define PIN_MODE 100 | ||
+ | #define DIGITAL_WRITE 101 | ||
+ | #define DIGITAL_READ 102 | ||
+ | #define ANALOG_WRITE 103 | ||
+ | #define ANALOG_READ 104 | ||
+ | | ||
+ | A chaque commande un certain nombre de paramètres est requis. Pour écrire sur une sortie digitale on enverra trois caractères: | ||
+ | |||
+ | Ce code vous permet d' | ||
+ | |||
+ | Une classe python est créée pour permettre un interfaçage facile. | ||
+ | |||
+ | **commandesPython.py** | ||
+ | |||
+ | # -*- coding: utf-8 -*- | ||
+ | import serial | ||
+ | | ||
+ | class Arduino(): | ||
+ | def__init__(self, | ||
+ | self.ser = serial.Serial(port, | ||
+ | c_recu = self.ser.read(1) | ||
+ | while ord(c_recu)!=0: | ||
+ | c_recu = self.ser.read(1) | ||
+ | c_recu = self.ser.read(1) | ||
+ | while ord(c_recu)!=255: | ||
+ | c_recu = self.ser.read(1) | ||
+ | c_recu = self.ser.read(1) | ||
+ | while ord(c_recu)!=0: | ||
+ | c_recu = self.ser.read(1) | ||
+ | self.PIN_MODE = 100 | ||
+ | self.DIGITAL_WRITE = 101 | ||
+ | self.DIGITAL_READ = 102 | ||
+ | self.ANALOG_WRITE = 103 | ||
+ | self.ANALOG_READ = 104 | ||
+ | self.INPUT = 0 | ||
+ | self.OUTPUT = 1 | ||
+ | self.LOW = 0 | ||
+ | self.HIGH = 1 | ||
+ | | ||
+ | def close(self): | ||
+ | self.ser.close() | ||
+ | | ||
+ | def pinMode(self, | ||
+ | self.ser.write(chr(self.PIN_MODE).encode()) | ||
+ | self.ser.write(chr(pin).encode()) | ||
+ | self.ser.write(chr(mode).encode()) | ||
+ | | ||
+ | def digitalWrite(self, | ||
+ | self.ser.write(chr(self.DIGITAL_WRITE).encode()) | ||
+ | self.ser.write(chr(pin).encode()) | ||
+ | self.ser.write(chr(output).encode()) | ||
+ | | ||
+ | def digitalRead(self, | ||
+ | self.ser.write(chr(self.DIGITAL_READ).encode()) | ||
+ | self.ser.write(chr(pin).encode()) | ||
+ | x = self.ser.read(1) | ||
+ | return ord(x) | ||
+ | | ||
+ | def analogWrite(self, | ||
+ | self.ser.write(chr(self.ANALOG_WRITE).encode()) | ||
+ | self.ser.write(chr(pin).encode()) | ||
+ | self.ser.write(chr(output).encode()) | ||
+ | | ||
+ | def analogRead(self, | ||
+ | self.ser.write(chr(self.ANALOG_READ).encode()) | ||
+ | self.ser.write(chr(pin).encode()) | ||
+ | c1 = ord(self.ser.read(1)) | ||
+ | c2 = ord(self.ser.read(1)) | ||
+ | return c1*0x100+c2 | ||
+ | |||
+ | **fichier test.py** | ||
+ | |||
+ | # -*- coding: utf-8 -*- | ||
+ | import time | ||
+ | from commandesPython import Arduino | ||
+ | | ||
+ | port = " | ||
+ | ard = Arduino(port) | ||
+ | | ||
+ | ard.pinMode(13, | ||
+ | | ||
+ | | ||
+ | | ||
+ | for i in range(10): | ||
+ | print(ard.analogRead(0)) | ||
+ | print(i) | ||
+ | ard.digitalWrite(13, | ||
+ | time.sleep(0.5) | ||
+ | ard.digitalWrite(13, | ||
+ | time.sleep(0.5) | ||
+ | | ||
+ | ard.close() | ||
+ | | ||
+ | Si la commande en ligne de commande vous semble trop austère, il est possible d' | ||
+ | |||
+ | # -*- coding: utf-8 -*- | ||
+ | import time | ||
+ | from commandesPython import Arduino | ||
+ | from tkinter import * | ||
+ | | ||
+ | class App(Arduino): | ||
+ | def __init__(self): | ||
+ | self.port = " | ||
+ | self.ard = Arduino(self.port) | ||
+ | self.W=200 | ||
+ | self.H=200 | ||
+ | self.root = Tk() | ||
+ | self.create_interface() | ||
+ | self.update_clock() | ||
+ | self.configure() | ||
+ | self.root.mainloop() | ||
+ | | ||
+ | def send_arduino(self): | ||
+ | self.ard.digitalWrite(13, | ||
+ | time.sleep(0.25) | ||
+ | self.ard.digitalWrite(13, | ||
+ | time.sleep(0.25) | ||
+ | | ||
+ | def create_interface(self): | ||
+ | can = Canvas(self.root, | ||
+ | can.pack(side=TOP, | ||
+ | btn1 = Button(self.root, | ||
+ | btn1.pack(side=LEFT) | ||
+ | self.text1=Label(self.root, | ||
+ | self.text1.pack() | ||
+ | | ||
+ | def configure(self): | ||
+ | self.ard.pinMode(13, | ||
+ | |||
+ | def update_clock(self): | ||
+ | now = time.strftime(" | ||
+ | self.text1.configure(text= self.ard.analogRead(0)) | ||
+ | self.root.after(1000, | ||
+ | | ||
+ | app=App() | ||
+ | |||
+ | |||
+ | Deuxième exemple, plus évolué: un programme python qui embarque un serveur twisted pour contrôler l' | ||
+ | Exemple de commandes: | ||
+ | |||
+ | <A href=" | ||
+ | <A href=" | ||
+ | <A href=" | ||
+ | <A href=" | ||
+ | |||
+ | """ | ||
+ | Programme de gestion d'une Arduino à partir de Python | ||
+ | A partir de tkinter, twisted et commandesPython (R) | ||
+ | MrT - sebastien.tack@ac-caen.fr | ||
+ | """ | ||
+ | from tkinter import * | ||
+ | from twisted.internet import tksupport, reactor | ||
+ | from twisted.web import server, resource | ||
+ | from twisted.internet import reactor, endpoints | ||
+ | from commandesPython import Arduino | ||
+ | import serial.tools.list_ports | ||
+ | import sys | ||
+ | | ||
+ | class Counter(resource.Resource): | ||
+ | isLeaf = True | ||
+ | numberRequests = 0 | ||
+ | | ||
+ | | ||
+ | def __init__(self, | ||
+ | """ | ||
+ | Constructeur de la classe | ||
+ | """ | ||
+ | self.root = root | ||
+ | self.port = None | ||
+ | ports = list(serial.tools.list_ports.comports()) | ||
+ | for p in ports: | ||
+ | if " | ||
+ | self.port =str(p[1][p[1].find(" | ||
+ | try: | ||
+ | self.ard = Arduino(self.port) | ||
+ | | ||
+ | except: | ||
+ | print(" | ||
+ | self.root.destroy() | ||
+ | sys.exit(1) | ||
+ | self.make_interface() | ||
+ | |||
+ | def make_interface(self): | ||
+ | """ | ||
+ | Création de l' | ||
+ | """ | ||
+ | self.text2 = Label(self.root, | ||
+ | self.text2.pack() | ||
+ | | ||
+ | |||
+ | def send_arduino(self, | ||
+ | """ | ||
+ | Envoi des ordres en sortie sur Arduino | ||
+ | """ | ||
+ | self.ard.digitalWrite(port, | ||
+ | | ||
+ | def render_GET(self, | ||
+ | """ | ||
+ | Gestion des réponses GET | ||
+ | """ | ||
+ | # | ||
+ | self.numberRequests += 1 | ||
+ | #trouver path | ||
+ | content= "" | ||
+ | req = request.uri | ||
+ | if b' | ||
+ | pass | ||
+ | | ||
+ | if req==b'/': | ||
+ | | ||
+ | content ='< | ||
+ | content | ||
+ | content += "< | ||
+ | content += u'< | ||
+ | content += u'< | ||
+ | content += u'< | ||
+ | content += u'< | ||
+ | content += "</ | ||
+ | | ||
+ | if b'/ | ||
+ | | ||
+ | ordres = req.split(b'/' | ||
+ | pin = int(ordres[3]) | ||
+ | mode = (ordres[4] == b' | ||
+ | self.ard.pinMode(pin, | ||
+ | self.send_arduino(pin, | ||
+ | content ='< | ||
+ | content = " | ||
+ | content += "</ | ||
+ | | ||
+ | if b'/ | ||
+ | | ||
+ | ordres = req.split(b'/' | ||
+ | pin = int(ordres[3]) | ||
+ | value = self.ard.analogRead(pin) | ||
+ | content ='< | ||
+ | content += "Pin " | ||
+ | content += "</ | ||
+ | | ||
+ | if b'/ | ||
+ | | ||
+ | ordres = req.split(b'/' | ||
+ | pin = int(ordres[3]) | ||
+ | mode = int(ordres[4]) | ||
+ | self.ard.pinMode(pin, | ||
+ | content ='< | ||
+ | content += u" | ||
+ | content += "</ | ||
+ | | ||
+ | request.setHeader(b" | ||
+ | return content.encode(" | ||
+ | | ||
+ | """ | ||
+ | Début du programme | ||
+ | """ | ||
+ | | ||
+ | try: | ||
+ | site = Counter(Tk()) | ||
+ | tksupport.install(site.root) | ||
+ | endpoints.serverFromString(reactor, | ||
+ | reactor.run() | ||
+ | except: | ||
+ | pass | ||
+ | | ||
+ | On peut maintenant construire des pages HTML et réaliser des requêtes Ajax en jQuery sur ces URL pour piloter une Arduino à partir de pages Web. ;) |
13_-_arduino_et_python.1530352460.txt.gz · Dernière modification : 2020/09/26 15:15 (modification externe)