Tag Archive | arduino

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);

Servon käyttö arduinossa

Sain tehtäväksi kokeilla servon käyttöä arduinolla. Aluksi käytän hyväksi servo.h-kirjaston tarjoamia funktioita attach() ja write(), joilla liitän servon tiettyyn pin-paikkaan arduinossa ja ohjaan servoa kääntymään tietyn määreen verran haluamaani suuntaan.aloitin tekemällä ohjelman, joka kasvattaa muuttujaa arvoon 180 asti. Sen jälkeen arvo lähtee laskemaan takaisin kohti 0, jolloin servolle syötettäessä, arvot mahdollistavat 180-asteen edestakaisen pyörähdyksen. Samalla luetaan servon pulssitiedot pinniltä ja kirjoitetaan serial porttiin ASCII-muodossa, mikä näkyy tietokoneella ajettaessa IDE:ssä.

#include Servo.h;

Servo newServo;
int pos;

void setup() {
newServo.attach(9);
Serial.begin(9600);
}

void loop() {
value = analogRead(9);
for (pos = 0; pos < 180; pos += 1;) {
newServo.write(pos);
Serial.println(value);
delay(20);
}
for (pos = 180; pos > 0; pos -= 1;) {
newServo.write(pos);
Serial.println(value);
delay(20);
}
}

Seuraavaksi tein ohjelman joka tekee saman kuin edellinen, mutta ilman servo.h-kirjastoa

int pos;
int pin = 9;

void setup() {
pinmode(pin, OUTPUT);
}
void loop() {
for (pos = 0; pos < 180; pos += 1;) {
analogwrite(pin,10);
delay(100);
analogwrite(pin,0);
}
for (pos = 180; pos > 0; pos -= 1;) {
analogwrite(pin, 10);
delay(100);
analogwrite(pin, 0);
}
}

Koodien toiminnallisuudesta ei ole vielä täyttä varmuutta, sillä niiden toimintaa ei ole toistaiseksi vielä testattu Arduino-piirissä johtuen laitteiston puutteesta.

Lisäksi tehtävänä oli myös etsiä jokin omaperäinen arduino-projekti ja kuvailla sen toimintaa, sekä miettiä mahdollisia parannusehdotuksia. Löysin projektin, jossa arduino megasta, mp3-decoderista, sd-muistikortista ja nokian
5110 n-näytöstä on kasattu mp3-so Kehittäjä on koodannut yksinkertaisen käyttöliittymän, joka hakee
muistikortilla olevasta tekstitiedostosta tiedot soittolistoista ja musiikkikappaleista, jotka on ladattu
muistikortille. Käynnistyessään soitin tarkistaa, että tarvittavat osat ovat kytkettynä ja aktivoi pin-paikat,
minkä jälkeen tarkistetaan tekstitiedostolle määriteltyjen musiikkitiedostojen olemassaolo. Käyttöliittymä
antaa käyttäjälle mahdollisuuden luoda/poistaa/uudelleennimetä kappaleita ja soittolistoja mielensä mukaisesti ja
tiedot päivittyvät suoraan tekstitiedostolle.
Parannettavana ominaisuutena tuohon voisi kuulokepaikan rinnalle lisätä bluetooth-moduulin, jolloin soitin tukisi
myös langattomia kuulokkeita. Lisäksi mahdollinen usb-pc-tuki, jossa laite esiintyy tietokoneelle massamuistina,
nopeuttaisi muistikortilla olevien kappaleiden siirtämistä ja muokkaamista.

http://arduino.cc/forum/index.php/topic,114704.0.html