Pyduino, gränssnitt Arduino med Python via seriell kommunikation (3 / 4 steg)
Steg 3: Arduino skiss för Pyduino
Inorder att styra arduino med python vi måste skicka arduino små bitar av kod en i taget via den seriella anslutningen på vår dator. Hur tolkar arduino då detta budskap? Koden nedan berättar hur.
Kopiera och klistra in koden i din arduino programvara och ladda upp den till din arduino enhet.
När du gör det bör du få en bild som ser ut som ovan. I botten höger i fönstret ser du lite information om där arduino är beläget, utom att information vi behöver det för vår python kod.
/*
* Skiss att styra stiften på Arduino via seriella gränssnittet
*
* Kommandon genomförs med exempel:
*
* - RD13 -> läser Digital ingång på stift 13
* - RA4 - > läser Analog ingång på pin 4
* - WD13:1 -> skriver 1 (hög) till digital utgång stift 13
* - WA6:125 -> skriver 125 till analog utgång pin 6 (PWM)
*/
char drift; Innehar drift (R, W,...)
char läge; Innehar läget (D, A)
int pin_number; Innehar den pin-kod
int digital_value; Håller det digitala värdet
int analog_value; Håller det analoga värdet
int value_to_write; Innehar det värde som vi vill skriva
int wait_for_transmission = 5; Försening i ms för att få den seriella data
void set_pin_mode (int pin_number, char läge) {
/*
* Utför en pinMode() beroende på värdet för parametern
* mode:
* - I: S├ñtter till ingången
* - O: S├ñtter till utgång
* - P: Sätter till INPUT_PULLUP
*/
Växla (läge) {
fallet "I":
pinMode (pin_number, ingång);
bryta;
fallet ' o ':
pinMode (pin_number, produktionen);
bryta;
fallet "P":
pinMode (pin_number, INPUT_PULLUP);
bryta;
}
}
void digital_read (int pin_number) {
/*
* Utför digital läsa på pin_number och returnerar värdet läsa till seriell
* i detta format: D {pin_number}: {värde} \n där värdet kan vara 0 eller 1
*/
digital_value = digitalRead(pin_number);
Serial.Print('D');
Serial.Print(pin_number);
Serial.Print(':');
Serial.println(digital_value); Lägger till en avslutande \n
}
void analog_read (int pin_number) {
/*
* Utför en analog läsa på pin_number och returnerar värdet läsa till seriell
* i detta format: en {pin_number}: {värde} \n där värdet varierar från 0 till 1023
*/
analog_value = analogRead(pin_number);
Serial.Print('A');
Serial.Print(pin_number);
Serial.Print(':');
Serial.println(analog_value); Lägger till en avslutande \n
}
void digital_write (int pin_number, int digital_value) {
/*
* Utför en digital skriva på pin_number med digital_value
* Värdet måste vara 1 eller 0
*/
digitalWrite (pin_number, digital_value);
}
void analog_write (int pin_number, int analog_value) {
/*
* Utför en analog skriva på pin_number med analog_value
* Värdet måste vara intervallet 0 till 255
*/
analogWrite (pin_number, analog_value);
}
void setup() {
Serial.BEGIN(9600); Serial Port på 9600 baud
Serial.setTimeout(100); Istället för standard 1000ms, för
att påskynda Serial.parseInt()
}
void loop() {
Kontrollera om tecken som finns i bufferten
om (Serial.available() > 0) {
operation = Serial.read();
Delay(wait_for_transmission); Om inte försenas, är andra tecknet inte korrekt läsa
läge = Serial.read();
pin_number = Serial.parseInt(); Väntar på en int översändas
om (Serial.read() == ":'){
value_to_write = Serial.parseInt(); Samlar in värdet skrivs
}
Växla (drift) {
"R" i mål: / / läsa drift, e.g. RD12, RA4
om (läge == hade ") {/ / Digital läsa
digital_read(pin_number);
} else om (läge == "A") {/ / Analog Läs
analog_read(pin_number);
} annat {
bryta; Oväntade läge
}
bryta;
fallet "W": / / Skriv drift, e.g. WD3:1, WA8:255
om (läge == hade ") {/ / Digital skriva
digital_write (pin_number, value_to_write);
} else om (läge == "A") {/ / Analog skriva
analog_write (pin_number, value_to_write);
} annat {
bryta; Oväntade läge
}
bryta;
fallet är ": / / Pin-läge, e.g. MI3, MO3, MP3
set_pin_mode (pin_number, läge); Läget innehåller I, O eller P (INPUT, OUTPUT eller PULLUP_INPUT)
bryta;
standard: / / oväntade röding
bryta;
}
}
}