Tag Archive | led

Arduino ja Python

Sain kotitehtäväksi testata pythonin ja arduinon välistä rajapintaa serialin kautta. Ensimmäinen tehtävä on lukea tietokoneella Arduinon lähettämää tietouomasin koodin kirjoittamisen aikana, että koneellani oleva python 3.30 versio ei pysty lähettämään seriaaliin kirjaimia sellaisenaan, vaan ne on muutettava ensin biteiksi. Tämä tapahtuu kirjoittamalla metodiin write() encode-metodin, esimerkiksi write(’5’) riittäisi pythonin aikaisemmille versioille, mutta python 3.30 tulee kirjoittaa write(’5’.encode(’UTF-8’)).

Kirjoitin komentokehotteella seuraavan python-koodin:

import serial

s = serial.Serial(”/dev/ttyACM0”, 9600); //ensimmäinen polku viittaa porttia, johon arduinoni oli kytketty, tarkista oman arduinosi portti ja täydennä koodiin. 9600 viittaa serialmonitorin kanavaan jota käytetään datan lähettämiseen

while True:
print(s.readline());

ja Arduino IDE:lle kirjoitin

void setup() {
Serial.begin(9600);
}

void loop() {
Serial.println(”this will be readable at computer screen”);
delay(1000);
}

python-ohjelma tulostaa seuraavia rivejä sekunnin välein:
B’this will be readable at computer screen\r\n

Seuraavana tehtävänä oli kirjoittaa tietokoneelta arduinolle , tämäkin onnistuu pythonilla käytteäen
serial-porttia Arduinolla

String s;
void setup() {
Serial.begin(9600);
}

void loop() {
while(Serial.available() || s.length() == 18) { //varmistetaan että dataa tulee ja rivin pituus vastaa python-ohjelmaan annettua lausetta
char c = Serial.read();
s = s + c;
}

Serial.println(s);
s = ””;
delay(1000); //odottaa sekunnin
}

ja Pythonille seuraava koodi:

import serial
import time

ser = serial.Serial(”/dev/ttyACM0”, 9600);

while True:
ser.write(”readable at arduino”.encode(’UTF-8’));
time.sleep(2); //odottaa 2 sekuntia

Syöte on luettavissa arduinon serialmonitorilta 9600 baudin kohdalta. Ohjelma tulostaa vuorotellen tekstirivin ja tyhjän rivin johtuen delayn ja time.sleepin aikaerosta

Seuraavana tehtävänä minun tuli tehdä ohjelma, joka kytkee arduinossa olevan ledin päälle ja pois
Sijoitin arduinon digitaaliseen pinniin nro 12 ja GND:hen ledin. seuraavaksi tein seuraavan koodin pythonilla:

import serial
import time

s = serial.Serial(’/dev/ttyACM0’, 9600);

while True:

s.write(’A’.encode(’UTF-8’)); // kirjain A on merkkinä ledin käynnistämisestä Arduinolla
s.close();
print(”led is ON”); //Ilmoitetaan komentokehotteella että ledin pitäisi nyt palaa
time.sleep(5); // odotetaan 5 sekuntia
s.open();
s.write(’B’.encode(’UTF-8’)); // kirjain B on merkkinä ledin sammuttamisesta
s.close();
print(”led is OFF”);
time.sleep(5);
s.open();

ja arduinoon seuraavan koodin

char ser;
void setup() {
Serial.begin(9600);
pinMode(12, OUTPUT);
}

void loop() {
if (Serial.available()) { //Arduino tarkistaa, onko seriaalin kautta tulossa dataa
ser = Serial.read();

if (ser == ’A’) { // mikäli seriaalissa lukee A, laitetaan ledi päälle
digitalWrite(12,HIGH);
}
else if (ser == ’B’) { //mikäli seriaalissa lukee B, laitetaan ledi pois
digitalWrite(12,LOW);
}

Sensorit arduinossa

Sain kotitehtäväksi kokeilla anturin käyttöä Arduino unolla. Päätin kokeilla kaikuluotaukseen perustuvan
HC-SR04-sensoria, jonka tilasin Kiinasta Dealextremen kautta. Aluksi rakensin kytkennät siten, että kohteen tullessa riittävän lähelle, ledi alkaa palaa kirkkaammin. Toisinsanoen sykirjoitan lediin analogiarvoja väliltä 0-255 sen mukaan, miten lähellä kohde on sensoria. Laite toimii oikein, mutta huomasin että sensori antaa välillä myös negatiivisia lukemia, mikä estää lediä sammumasta kun esine otetaan pois sensorin edestä. Tämä kuitenkin korjaantui täsmentämällä koodiin arvoalueen, jonka perusteella ledin voimakkuus määräytyy. Huomasin myös, että ledin voimakkuksissa ei ollut silminnähden eroa, joten käytännössä laite vain sytyttää ledin palamaan mikäli este laitetaan sensorin eteen, vaikka ledin kirkkaudesta pitäisi nähdä selkeä ero.

Tässä on koodi:

#define TRIGPIN 2
#define ECHOPIN 3
int led = 12;

void setup() {
pinMode(led, OUTPUT);
pinMode(TRIGPIN, OUTPUT);
pinMode(ECHOPIN, INPUT);
Serial.begin(9600);

}

void loop() {

digitalWrite(TRIGPIN,LOW);
delayMicroseconds(2);
digitalWrite(TRIGPIN,HIGH);
delayMicroseconds(10);
digitalWrite(TRIGPIN, LOW);

int distance = pulseIn(ECHOPIN,HIGH);