Google+

Πέμπτη 19 Μαΐου 2011

Arduino Flash communication

Αν θέλεις να βάλεις λίγο χρώμα στο project σου, πέρα από το να χρησιμοποιείς πολύχρωμα
μια καλή ιδέα είναι, να επικοινωνήσεις με το Arduino μέσω Flash+ActionScript. Αυτό που θα χρειαστεί είναι ένας SerialProxy για να μετατρέψει τα δεδομένα από τη serial/usb πόρτα του Arduino στα XML socket data που χρησιμοποιεί για επικοινωνία το Flash/AS, μέσω ενός network data socket.

Η λογική επικοινωνίας είναι η εξής :

Arduino USB/Serial <---> Com (port,baud) <---> SerialProxy <---> localhost:port<---> Flash/AS

Για μια δοκιμή επικοινωνίας μεταξύ Arduino<->Flash επέλεξα την AS3Glue Library που περιλαμβάνει ένα demo monitor πρόγραμμα για το Arduino και πηγαίο κώδικα για ανάπτυξη.

Ας δούμε λοιπόν, αναλυτικά τα βήματα :

1. Φόρτωση από το Arduino IDE του example code(StandardFirmata) από τη firmata library:

























2. Ανάκτηση της σειριακής θύρας σύνδεσης του Arduino με το pc:

















3. Το SerialProxy το κατεβάζετε από εδώ και το μόνο που χρειάζεται είναι στο serproxy.cfg να δηλωθεί η com (port,baud) με την οποία συνδέεται το arduino με το pc και η πόρτα (net_port=5331) που θα χρησιμοποιηθεί από την flash:

# Comm ports used
comm_ports=2

# Default settings
comm_baud=9600
comm_databits=8
comm_stopbits=1
comm_parity=none

# Port 2 settings (ttyS1)
net_port2=5331

4. Εκτέλεση του serialproxy:






5. Εκτέλεση arduino flash monitor που περιέχεται στην AS3Glue library (as3glue_standalone_monitor.swf). Το default παίζει στη net_port=5331 αν θέλετε διαφορετική πόρτα θα πρέπει να κάνετε edit και recompile τον κώδικα flash(.fla)+actionscript(.as) που υπάρχουν μέσα στο source φάκελο της library:
















Αν όλα πήγαν καλά ΣΥΓΧΑΡΗΤΗΡΙΑ!!! θα βλέπετε την παραπάνω εικόνα και θα μπορείτε να διαχειριστείτε το Arduino (digital i/o port status/on/off, analog port status).

Να κι ένα βίντεο από το demo.

Τέλος, άφθονο υλικό για τους...καλλιτέχνες εδώ

Παρασκευή 13 Μαΐου 2011

Google Launches Android Open Accessory Development Kit Based On Arduino

Στο φετινό Google IO 2011 έγινε η παρουσίαση της δημιουργίας του Android Open Accessory Development Kit (ADK) το οποίο παρέχει την δυνατότητα σύνδεσης, μέσω USB προς το παρόν, μιας συσκευής με λειτουργικό Android κι ενός Android USB Accessory που είναι βασισμένο στην Ανοικτή πλατφόρμα ανάπτυξης του Arduino και ουσιαστικά περιλαμβάνει :
  • τα hw design schematics
  • τον κώδικα που υλοποιεί το firmware του Accessory
  • και την εφαρμογή για το Android που "αλληλεπιδρά" με τo accessory
Το accessory είναι βασισμένο στο Arduino MEGA2560 και Circuits@Home USB Host Shield και περιλαμβάνει και ένα shield με αισθητήρες όπως φαίνεται φωτογραφία παραπάνω και είναι διαθέσιμο για παραγγελία, προς το παρόν, μόνο από Ιαπωνία.

Υπάρχει και επίσημο video από το session της παρουσίασης του ADK στο Google IO.

πηγή[arduino.cc]

Σάββατο 16 Απριλίου 2011

Using Optoisolator w/ arduino to control other circuits

Μόλις δοκίμασα ένα optoisolator (ή αλλιώς optocoupler) για να ανοίγω/κλείνω (ως διακόπτης) ένα άλλο κύκλωμα με το Arduino. Η αρχή λειτουργίας του optoisolator είναι πολύ απλή, με 2 κυκλώματα οπτικά-απομονωμένα, το πρώτο να αποτελείται από 1 LED και το δεύτερο από 1 phototransistor σε ένα πακέτο DIP. Μόλις ανάψει το LED, το phototransistor διοχετεύει με ρεύμα τον collector/emitter του.

Σχηματική λειτουργία :


Στο παράδειγμα χρησιμοποιώ το 4N25 και "οδηγώ" το digital pin 13 του Arduino για να ανοίγω/κλείνω το LED του optoisolator και κατ' επέκταση, το διακόπτη του εξωτερικού κυκλώματος.

Υλικά HW:
1. 4N25 optoisolator
2. αντίσταση R=220Ω (οτιδήποτε από 220Ω-550Ω είναι οκ)
3. εξωτερικό κύκλωμα με push button (δείτε στο βίντεο τι κύκλωμα χρησιμοποίησα)

Συνδεσμολογία:
1. Arduino Pin13 -> R -> A(4N25)
2. Arduino GND -> B(4N25)
3. C(4N25) -> Vcc switch of ext. circuit (βλ. φώτο)
4. D(4N25) -> GND switch of ext. circuit (βλ. φώτο)

Φώτο κυκλώματος:


sketch code:

// 4N25 test sketch

#define INTERVAL_TM 4000 //time interval
#define EXPOSURE_TM 1000 //pin 13 HIGH duration
#define LED_PIN 13 //use LED pin as output

void setup() {
pinMode(LED_PIN, OUTPUT); //set pin13 as output
}

void loop() {
digitalWrite(LED_PIN, HIGH);
delay(EXPOSURE_TM);
digitalWrite(LED_PIN, LOW);
delay(INTERVAL_TM);
}

Βίντεο δοκιμής.

Θεωρία για optoisolator εδώ, εδώ κι εδώ ;)

Τέλος, για την ίδια δουλειά υπάρχουν relay (τα ρελέ είναι συνήθως πιο "αργά" από optoisolator) και H-bridge(ικανά να "οδηγούν" μεγαλύτερα ρεύματα πχ dc/stepper/servo motors κτλ)

Παρασκευή 8 Απριλίου 2011

Open Hardware Logo Selected


Η δημόσια και ανοικτή σε όλους ψηφορία για την επιλογή Logo ολοκληρώθηκε επιτυχώς! Το Open Hardware Summit συγχαίρει και ευχαριστεί όλους όσους ψήφισαν.

Αν θέλετε να υποστηρίξετε το OSHW Definition 1.0, διαδώστε το! Τοποθετείστε κι εσείς LOGO & OSHW Definition στα έργα, στα κυκλώματά και τις κατασκευές σας. Εισάγετε το παρακάτω κομμάτι κώδικα στο website σας.




I support the Open Source Hardware Definition v1.0



Άλλη μια μεγάλη μέρα για το Open Hardware!

Τετάρτη 23 Μαρτίου 2011

Arduino IR Remote Control

Η προσθήκη δυνατότητας απομακρυσμένου ελέγχου μιας εφαρμογής-κατασκευής με Arduino πάντα συναρπάζει το χρήστη αλλά και το δημιουργό. Ένας από τους πιο φτηνούς τρόπους απομακρυσμένης επικοινωνίας υλοποιείται με τη χρήση "υπερύρθρων" IR.

Ευτυχώς, η περισσότερη δουλειά έχει ήδη γίνει από άλλους και το μόνο που "μένει" για κάποιον είναι, απλά να σκεφτεί μια ιδέα για μια πραγματική εφαρμογή χρήσης ;)

Στο δικό μου πολύ απλό παράδειγμα, χρησιμοποιώ τη βιβλιοθήκη #IRremote.h και επεκτείνω την υλοποίηση του @efxa για την εμφάνιση κι ενός μηνύματος σε μια LCD ελεγχόμενο από ένα IR TV Remote . Στην αρχική υλοποίηση παρέχονται τα εξής σημαντικά :

1. IR remote code reading/learning via #IRremote.h
2. EEPROM save/load
3. Arduino <-> PC connectivity through serial/usb
4. Python script to execute external programs on linux

H δική μου προσθήκη :

5. Εμφάνιση μηνύματος στην LCD (πχ κανάλι)

HW υλικά για IR :
1. TSOP1238 IR Receiver Module (datasheet)
2. 220Ω resistor
3. push button

φώτο με όλα τα υλικά στο ράστερ :



TSOP1238+Push button(δεξιά)

SW code (προσθήκη στο έργο του @efxa):



#include shiftreglcd.h

ShiftRegLCD srlcd(12, 13, 8); // set the pin number for data,clock,enable

// display each character to the LCD
srlcd.clear();
delay(20);
int i=index; // use the remoteKey array index as display number
srlcd.print("Ch. ");
srlcd.print(i);
Βίντεο από τη λειτουργία του μπορείτε να δείτε εδώ.

Τέλος, κάποια βασικά για pull-down/up resistors εδώ.

Πέμπτη 24 Φεβρουαρίου 2011

Use 2 or 3 wires for Arduino <-> LCD interface

Το "κακό" με τις LCD που χρησιμοποιούν τον ελεγκτή της σειράς HD447xx είναι, ότι δεσμεύεις τουλάχιστον 7 pin στο Arduino για τον "οδηγήσεις" (4 -αν όχι 8- για data και 3 για enable, r/w, reset) οπότε, σου περισσεύουν λιγότερα pin για άλλα, πιο χρήσιμα για την κατασκευή σου όπως αιθητήρες, διακόπτες, led, κουμπιά κτλ.

Για το παραπάνω πρόβλημα υπάρχουν 2 λύσεις :

1. βρίσκεις/αγοράζεις μια έτοιμη serial LCD που δεσμεύει λιγότερα pin
2. κατασκευάζεις μια serial LCD χρησιμοποιώντας καταχωρητή ολίσθησης-shift register για να οδηγήσεις thν υπάρχουσα "παράλληλη" LCD με τον HD447xx

Ειδικότερα για το 2. έχει δημιουργηθεί library(ShiftRegLCD) και schematic για την χρήση του 74LS164 ως καταχωρητή ολίσθησης που θα βρείτε εδώ.

Μερικές φώτο από μια δοκιμή με 74LS164 :


3 καλώδια πράσινο(clk), πορτοκαλί(data), κίτρινο(enable).


full working set : lcd(κάτω), arduino(πάνω), 74ls164(δεξιά)


μερικοί custom characters από τα example codes της library

Τέλος, ένα pdf με λίγη θεωρία για τους καταχωρητές ολίσθησης.

PS. Many thanx @efxa για το tip με τη library!

Δευτέρα 21 Φεβρουαρίου 2011

LM35 + LCD HD44780 = VisioTherm1.0

Συνδέσετε το Arduino με έναν αισθητήρα θερμοκρασίας LM35 και μια οθόνη LCD (parallel HD44780) για να φτιάξετε το δικό σας θερμόμετρο κι όχι μόνο!

Συνδεσμολογία Arduino-LCD εδώ.

Δείτε και το βίντεο.

Παρακάτω, ο κώδικας της εφαρμογής VisioTherm 1.0 - download :



/* VisioTherm - Temperature Sensor(LM35) reading and optical representation to LCD(HD47780) display
*
* Copyright (c) 2011 Stavros Kalapothas (stavros@itsystem.gr)
* Version 1.0 (27/01/2011)
* License: GPL v3 (http://www.gnu.org/licenses/gpl.html)
*
* This sketch is based on the "LCD Hola example" by DojoDave, Tomek for K3 and fh-potsdam. I have used LM35 temperature sensor and an LCD with HD44780 controller L1671 (16 chars x 1 line).
* According to LCD specs L1671 is initialized as a 2 line display so the second 8 chars (9-16) are addressed beginning on (C0).
*
* There are the following pins to be considered:
*
* DI, RW, DB0..DB3, Enable, tempPin (8 in total)
*
*/

//LM35 init vars
float tempC;
int tempD;
int tempPin = 0;

//LCD init vars
int led = 13;
int DI = 12;
int RW = 11;
int DB[] = { 7, 8, 9, 10};
int Enable = 6;
int count = 0;
int blink_count = 0;

void LcdCommandWrite(int value) {
int i = 0;
int value1 = 0;
value1 = value;

value1 >>= 4; //send the first 4 databits (from 8) + RW and DI
for (i=DB[0]; i <= DI; i++) {
digitalWrite(i,value1 & 01);
value1 >>= 1;
}
digitalWrite(Enable,LOW); // send a pulse to enable
delayMicroseconds(1);
digitalWrite(Enable,HIGH);
delayMicroseconds(1);
digitalWrite(Enable,LOW);
delayMicroseconds(1); // pause 1 ms according to datasheet
delay(1);

for (i=DB[0]; i <= DB[3]; i++) { // second part of the second 4 bits (from 8)
digitalWrite(i,value & 01);
value >>= 1;
}
value >>= 4; // send the RW and DI of the second 4 bits(from 8)
for (i=RW; i <= DI; i++) {
digitalWrite(i,value & 01);
value >>= 1;
}
digitalWrite(Enable,LOW); // send a pulse to enable
delayMicroseconds(1000);
digitalWrite(Enable,HIGH);
delayMicroseconds(1000);
digitalWrite(Enable,LOW);
delayMicroseconds(1000); // pause 1 ms according to datasheet
}

void LcdDataWrite(int value) {
int i = 0;
int value1 = 0;
digitalWrite(DI, HIGH);
digitalWrite(RW, LOW);
value1 =value;
value1 >>= 4; //send the first 4 databits (from 8)
for (i=DB[0]; i <= DB[3]; i++) {
digitalWrite(i,value1 & 01);
value1 >>= 1;
}
digitalWrite(Enable,LOW); // send a pulse to enable
delayMicroseconds(1000);
digitalWrite(Enable,HIGH);
delayMicroseconds(1000);
digitalWrite(Enable,LOW);
delayMicroseconds(1000); // pause 1 ms according to datasheet
delay(1);
digitalWrite(DI, HIGH);
digitalWrite(RW, LOW);
for (i=DB[0]; i <= DB[3]; i++) {
digitalWrite(i,value & 01);
value >>= 1;
}
digitalWrite(Enable,LOW); // send a pulse to enable
delayMicroseconds(1000);
digitalWrite(Enable,HIGH);
delayMicroseconds(1000);
digitalWrite(Enable,LOW);
delayMicroseconds(1000); // pause 1 ms according to datasheet
}

// this function help us to write number over 9, easily in the lcd display

void LcdNumberWrite(int nr) {

int n1 = 0;
int n2 = 0;

n1 = n2 = nr;

n1 = n1 / 100;
LcdCommandWrite(560 + n1); //512 used to write data (see commands for character module)
n2 = (n2 - n1 * 100) / 10;
LcdCommandWrite(560 + n2); //512 used to write data (see commands for character module)
nr = nr - n1 *100 - n2 * 10;
LcdCommandWrite(560 + nr); //512 used to write data (see commands for character module)
}

void setup (void) {

//LM35 init
Serial.begin(9600); //open serial port, sets data rate to 9600 bps
analogReference(INTERNAL);

//LCD init
int i = 0;
for (i=Enable; i <= DI; i++) {
pinMode(i,OUTPUT);
}
delay(100);
// initiatize lcd after a short pause
// needed by the LCD controller

///////////////////////////////////////////////////// 4 pin initialization
LcdCommandWrite(0x03); // function set:
// 4 pin initialization
delay(64);
LcdCommandWrite(0x03); // function set:
// 4 pin initialization
delay(50);
LcdCommandWrite(0x03); // function set:
// 4 pin initialization
delay(50);
LcdCommandWrite(0x02); // function set:
// 4 pin initialization
delay(50);
LcdCommandWrite(0x28); // function set:
// 4-bit interface, 2 display lines, 5x7 font
///////////////////////////////////////////////////// end of 4 pin initialization
delay(20);
LcdCommandWrite(0x06); // entry mode set:
// increment automatically, no display shift
delay(20);
LcdCommandWrite(0x0E); // display control:
// turn display on, cursor on, no blinking
delay(20);
LcdCommandWrite(0x01); // clear display, set cursor position to zero
delay(100);

LcdCommandWrite(0x80); // display control:
delay(20);

//////// under this line are the special stuff you don't need for a initialization

LcdCommandWrite(0x0F); // cursor blink
delay(10);
}

void loop (void) {

tempC = analogRead(tempPin); //read the analog value from the sensor
tempC = (1.1 * tempC * 100.0)/1024; //convert the analog data to temperature
tempD=tempC*100;
Serial.println(tempC); //send the data to the computer for debug

//>>>>>>>>>>>>>>>>>>>>>>>>>>>possible commands for the Lcd Display>>>>>>><< able to use for LcdDisplays with 4 or with 8 DataPins

//LcdCommandWrite(0x01); // clear display, set the cursor to home position
//LcdCommandWrite(0x02); // set cursor position to zero
//LcdCommandWrite(0x0A); // set the display off
//LcdCommandWrite(0x0E); // set the display on and with out cursor blink
//LcdCommandWrite(0x0F); // set the display on and with cursor blink
//LcdCommandWrite(0x0F); // cursor blink
//LcdCommandWrite(0x0E); // cursor not blink
//LcdCommandWrite(0x18); // shift display and cursor to the left
//LcdCommandWrite(0x1c); // shift display and cursor to the right
//LcdCommandWrite(0x14); // shift cursor to the right
//LcdCommandWrite(0x10); // shift cursor to the left

//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> example <<<<<<<<<

LcdCommandWrite(0x02); // set cursor position to zero
delay(10);

// Write the message
//like this
//LcdDataWrite('I');
//and Number over 9 easely like this
//LcdNumberWrite(4);

//first msg
for ( count = 0; count<=7; count++) {
int wrote [] = { 'I', 'T', 's', 'y', 's', 't', 'e', 'm'};
LcdDataWrite(wrote[count]);
}
LcdCommandWrite(0xC0); //enable second line (2nd 8 chars for an 1X16 LCD)
delay(20);
for ( count = 0; count<=7; count++) {
int wrote [] = { ' ', 'G', 'a', 'd', 'g', 'e', 't', 's'};
LcdDataWrite(wrote[count]);
}
delay(3000);

//scroll right
for ( count = 0; count<=7; count++) {
delay(500);
LcdCommandWrite(0x1c); //shift display & cursor to the right
}

LcdCommandWrite(0x01); //clear display
delay(1000);

//blink message 3 times
for ( blink_count = 0; blink_count<=2; blink_count++) {
//first 8 chars of message
for ( count = 0; count<=7; count++) {
int wrote [] = { 'V', 'i', 's', 'i', 'o', 'T', 'h', 'e'};
LcdDataWrite(wrote[count]);
}
//second 8 chars of message
LcdCommandWrite(0xC0); //enable second line
delay(20);
for ( count = 0; count<=7; count++) {
int wrote [] = { 'r', 'm', ' ', '2', '0', '1', '1', ' '};
LcdDataWrite(wrote[count]);
}
delay(1000);
LcdCommandWrite(0x01);
delay(1000);
}

//tempDisplay
LcdCommandWrite(0x01);
delay(1000);
tempDisplay(tempD);
delay(5000);
}

//temp reading calculation function
void tempDisplay(int value)
{
int first, second, third, fourth;

first = value / 1000;
second = (value - 1000 * first)/ 100;
third = (value - 1000 * first - 100 * second)/ 10;
fourth = (value - 1000 * first - 100 * second - 10 * third);

LcdDataWrite(' ');
LcdDataWrite(' ');
LcdDataWrite(' ');
LcdDataWrite(' ');
LcdDataWrite(' ');
LcdDataWrite(value > 999 ? first + 48 : ' '); // begin onscreen
LcdDataWrite(value > 99 ? second + 48 : ' ');
LcdDataWrite('.');
LcdCommandWrite(0xC0);
LcdDataWrite(third + 48);
LcdDataWrite(fourth + 48);
LcdDataWrite(0xDF);

}