Google+

Δευτέρα 24 Ιουνίου 2013

Xastir on RaspberryPi

Η συγκεκριμένη παρουσίαση απευθύνεται κυρίως στους ραδιοερασιτέχνες που ασχολούνται με τη μετάδοση APRS.

Ειδικότερα, θα ασχοληθούμε με την εγκατάσταση του Xastir σε ένα RaspberryPi.

Πρώτα απ' όλα μερικά εισαγωγικά, το Automatic Packet Reporting System (APRS) είναι σύστημα μετάδοσης δεδομένων, από ραδιοερασιτέχνες, για την πληροφόρηση χρηστών/πολιτών μια περιοχής με στοιχεία όπως καιρός (WX), σύντομα μηνύματα, στίγμα θέσης (GPS), δεδομένα τηλεμετρίας κ.α. Τα δεδομένα αυτά είναι ανοικτά και ευρέως διαθέσιμα προς το γενικό πληθυσμό και μεταδίδονται στο internet, μέσω ειδικού λογισμικού (πυλών), που ονομάζονται IGate.

Τεχνικά, αυτό επιτυγχάνεται με τη διαμόρφωση ηχητικών σήματων (AFSK), τα οποία μεταδίδονται σε συχνότητες RF, με τη χρήση πομποδεκτών από αδειοδοτημένους ραδιοερασιτέχνες. Η επικοινωνία η/υ με τον εξοπλισμό επικοινωνίας, περιλαμβάνει κυκλώματα-διατάξεις που αναφέρονται με τον όρο Terminal Node Controller (TNC) και περιλαμβάνουν κάρτες ήχου, modem κ.α.

ακούστε ένα ηχητικό δείγμα από ένα σήμα APRS:

Το Xastir αποτελεί μια ανοικτού κώδικα πλατφόρμα IGate για τη λήψη/μετάδοση από και προς το internet, δεδομένων APRS. H εγκατάστασή του σε ένα RaspberryPi είναι αρκετά εύκολη, προσφέροντας πολλαπλά οφέλη όπως η φορητότητα και η εξοικονόμηση ενέργειας. Για την εγκατάσταση σε Occidentalis Linux που είναι βασισμένο στο Raspbian (Debian για το Pi) ακολουθούμε τα εξής βήματα:

1. ενημέρωση συστήματος:
$ sudo apt-get update
$ sudo apt-get upgrade

2. εγκατάσταση xastir:
$ sudo apt-get install xastir

3. εκτέλεση στο γραφικό περιβάλλον από το /usr/bin:

4. παραμετροποίηση:
File->Configure->Station
Map->Map chooser
Interface->Interface Control
Properties


Για να επιβεβαιώσετε την επικοινωνία με τους APRS server μπορείτε να εμφανίσετε τα μηνύματα που ανταλλάσονται:
View->Incoming Data
.

Μια πολύ καλή εφαρμογή για δοκιμές, που εμφανίζει δεδομένα aprs σε Google map είναι το aprs.fi του OH7LZB 


Εναλλακτικά, αντί για το Xastir υπάρχουν και άλλοι APRS server (όχι όλοι για linux) που θα μπορούσαν να δοκιμαστούν, όπως UIView32, javAPRSSrvr κ.α. Περισσότερα για το κομμάτι TNC και η επικοινωνία RF<->IGate θα αναλυθεί σε κάποια επόμενη ανάρτηση.

Καλή επιτυχία & 73 !

Κυριακή 17 Μαρτίου 2013

Arduino & Processing HCI

Άλλη μια ωραία ιδέα για χρήση του Arduino ως μέσο διάδρασης ανθρώπου και υπολογιστή (HCI), με τη βοήθεια και της processing, είναι αυτή που παρουσιάζει ο LuckyLarry.

Πρόκειται για τη χρήση ενός αισθητήτα ultrasonic sonar όπου μετράται η απόσταση και εξάγεται ως τιμή μέσω της σειριακής. Αυτή η τιμή της απόστασης χρησιμοποιείται ως είσοδος στην processing η οποία αντίστοιχα αναπαράγει μουσική ήχους (συγκεκριμένα νότες πιάνου).

Η συνδεσμολογία του Arduino με τον αισθητήρα απλή:

Έγινε χρήση της βιβλιοθήκης arduino-new-ping που διορθώνει πολλά από τα πρόβληματα που παρουσιάζουν κάποιοι άλλοι μέθοδοι κώδικα όπως πχ η καθυστέρηση (~1s) στην ανάγνωση τιμών.

#include "newping.h"

#define TRIGGER_PIN  12  // Arduino pin tied to trigger pin on the ultrasonic sensor.
#define ECHO_PIN     11  // Arduino pin tied to echo pin on the ultrasonic sensor.
#define MAX_DISTANCE 50 // Maximum distance we want to ping for (in centimeters). Maximum sensor distance is rated at 400-500cm.

NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // NewPing setup of pins and maximum distance.

//setup
void setup() {  
  Serial.begin(9600);                           // start the serial port
} 

// execute
void loop() {
  delay(250);                      // Wait 50ms between pings (about 20 pings/sec). 29ms should be the shortest delay between pings.
  unsigned int uS = sonar.ping(); // Send ping, get ping time in microseconds (uS).
  if ( uS / US_ROUNDTRIP_CM > 0)  // send only values >0
  {
  Serial.println(uS / US_ROUNDTRIP_CM); // Convert ping time to distance and print result (0 = outside set distance range, no ping echo)
  }
}

Στον υπολογιστή, εκτελούμε σε processing τον παρακάτω κώδικα που ουσιαστικά "διαβάζει" τη θύρα serial/usb (που έχει συνδεθεί το Arduino) και μέσω της βιβλιοθήκης minim αναπαράγονται μουσικές νότες (freesound.org) ανάλογα με αυτήν την τιμή:


import processing.serial.*;                // import serial library so we can read the serial port
import ddf.minim.*; 

// define the serial port
Serial myPort;          

// define minim variables:
// here we say that variable A is an audiosample etc...
Minim minim;
AudioSample GSharp;
AudioSample A;
AudioSample Bb;
AudioSample B;
AudioSample C;
AudioSample CSharp;
AudioSample D;
AudioSample Eb;
AudioSample E;
AudioSample F;
AudioSample FSharp;
AudioSample G;

// setup
void setup () {

  // set up the variables, loading in the sound files from your project folder
  // which should be the same place as where you save this sketch
  // details on using minim and audioSample are here: http://code.compartmental.net/tools/minim/manual-audiosample/
  minim = new Minim(this);
  GSharp = minim.loadSample("GSharp.wav", 2048);
  A = minim.loadSample("A.wav", 2048);
  Bb = minim.loadSample("Bb.wav", 2048);
  B = minim.loadSample("B.wav", 2048);
  C = minim.loadSample("C.wav", 2048);
  CSharp = minim.loadSample("CSharp.wav", 2048);
  D = minim.loadSample("D.wav", 2048);
  Eb = minim.loadSample("Eb.wav", 2048);
  E = minim.loadSample("E.wav", 2048);
  F = minim.loadSample("F.wav", 2048);
  FSharp = minim.loadSample("FSharp.wav", 2048);
  G = minim.loadSample("G.wav", 2048);

  // List serial ports, saves us trying to figure out which COM we're using.
  println(Serial.list());
  // Open the active port - providing you've only got one sending serial data (which you should)
  myPort = new Serial(this, Serial.list()[1], 9600);
  // don’t read the serial buffer until we see a new line - this is genius and simple compared with my last efforts
  myPort.bufferUntil('\n');
}

void draw() {
  // we need to declare the draw function even though we're not using it!!
}

void serialEvent (Serial myPort) {
  // get the string from the serial buffer - gets all chars until the next line break...
  String bufferString = myPort.readStringUntil('\n');

  if (bufferString != null) {
    // get rid of any whitespace - sometimes the serial buffer can have blanks etc.. in the string
    bufferString = trim(bufferString);
    // convert the value to an int - we're only sending numbers over the serial port so parsing it to an int shouldn't ever be an issue.
    float inByte = float(bufferString);
    int pulse = int(bufferString);         // declare a variable to hold our value.
    println(pulse);                        // for debug print the value so we can check it.

    // remember that our pulse is in CM so if its less than 5cm then do this etc... else do this... else do this.. for as many sound samples
    if ( pulse < 5 ) {
      GSharp.trigger();
      delay(25);
    }
    else if ( pulse < 8 ) {
      A.trigger();
      delay(25);
    }
    else if ( pulse < 11 ) {
      Bb.trigger();
      delay(25);
    }
    else if ( pulse < 14 ) {
      B.trigger();
      delay(25);
    }
    else if ( pulse < 17 ) {
      C.trigger();
      delay(25);
    }
    else if ( pulse < 20 ) {
      CSharp.trigger();
      delay(25);
    }
    else if ( pulse < 23 )  {
      D.trigger();
      delay(25);
    }
    else if ( pulse < 26 ) {
      Eb.trigger();
      delay(25);
    }
    else if ( pulse < 29 ) {
      E.trigger();
      delay(25);
    }
    else if ( pulse < 32 ) {
      F.trigger();
      delay(25);
    }
    else if ( pulse < 35 ) {
      FSharp.trigger();
      delay(25);
    }
    else if ( pulse < 38 ) {
      G.trigger();
      delay(25);
    }
    else if ( pulse > 50 ) {
      // if the distance is greater than 50cm then play nothing
    }

  } // end if there's a value in the serial bufferstring

}   // end void serialevent()

void stop(){
  minim.stop();
  super.stop();
}

Κατεβάστε τον κώδικα (arduino+processing+sound files) δείτε κι ένα βίντεο:

Καλή επιτυχία!

Πέμπτη 3 Ιανουαρίου 2013

Water Tank Level Display

Μια ενδιαφέρουσα και συνάμα χρηστική ιδέα για κατασκευή αποτελεί αυτή του @Stelios, ο οποίος θέλοντας να παρακολουθεί ανά πάσα στιγμή τη στάθμη του νερού σε μια κλειστή δεξαμενή, χρησιμοποιήσε έναν αισθητήρα υπερήχων (ultrasonic sonar) HC-SR04 μαζί με ένα Arduino Nano, μια LCD για οπτική ένδειξη και ένα buzzer για την παραγωγή ήχων ειδοποίησης.


Παρακάτω, τα βήματα της κατασκευής:

Συγκέντρωση Υλικών:

HC-SR04 (ultrasonic sensor)
LCD 16x2 (HD44780)
LM35 (temp sensor)
Buzzer (ηχείο)
Διακόπτες (push button)
Συνδετήρας (4 pin connector m+f)
Κουτί (case)  

Αν και για την αρχική ανάπτυξη και δοκιμές, χρησιμοποιήθηκε το Arduino Uno, το τελικό "προϊόν"  περιελάμβανε το Arduino Nano το οποίο παρέχει τις ίδιες δυνατότητες σε πολύ μικρότερο μέγεθος.

 

Για τη σύνδεση της LCD που είναι βασισμένη στο HD44780 ανατρέξτε εδώ.

Ο αισθητήρας ultrasonic sonar HC-SR04 διαθέτει 4 pin (Vcc, Trigger, Echo, GND) εκ των οποίων 2, τα Trigger και Echo, συνδέοονται στα digital pins του Arduino. Στο Vcc pin συνδέουμε +5v από το Arduino. Η αρχή λειτουργίας του είναι απλή, το Trigger pin στέλνει ένα παλμό (HIGH) μικρής διάρκειας (~10μS) και το σήμα ανάκλασης από ένα αντικείμενο που επιστρέφει πίσω, εγείρει το Echo pin (HIGH). Η χρονική διάρκεια από τη μέταδοση μέχρι και τη λήψη του παλμού είναι γνωστή, οπότε η απόσταση υπολογίζεται εύκολα, αφού η ταχύτητας μετάδοσης είναι κι αυτή γνωστή και ισούται με 340m/s (ταχύτητα ήχου).


Επίσης, χρησιμοποιήθηκε το LM35 για τη μέτρηση θερμοκρασίας στο Analog pin 0.

Προσπαθώντας να χωρέσουν όλα αυτά σε ένα μικρό κουτί, υπήρξε αρκετό πριόνισμα και χρήση θερμόκολλας για να καταλήξει σε ικανοποιητικό αποτέλεσμα:

Τα 2 push-button και το buzzer έχουν "υποστηρικτό" ρόλο ως soft reset, mute και full/empty sound αντίστοιχα. Στον κώδικα ενσωματώνεται η βιβλιοθήκη <LiquidCrystal.h> για το χειρισμό της LCD και ο μηχανισμός για τα Trigger & Echo:

pinMode(TRIG, OUTPUT);
digitalWrite(TRIG, LOW);
delayMicroseconds(2);
digitalWrite(TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG, LOW);

pinMode(ECHO, INPUT);
float distance = pulseIn(ECHO, HIGH);
distance=distance / 29.387 / 2;
Serial.println(distance);

Παρακάτω, μια φωτογραφία με το τελικό κύκλωμα στο κουτί του. Στο πλάι διακρίνονται το κουμπί για soft reset, το mini usb για την τροφοδοσία και τον προγραμματισμό και ο 4-pin connector για τη σύνδεση του αισθητήρα sonar.


Ο πλήρης κώδικας είναι διαθέσιμος εδώ.


Δείτε κι ένα βίντεο από τη λειτουργία.

Κυριακή 11 Νοεμβρίου 2012

RaspberryPi playing with Arduino and Processing

Για αρχή, θα αρκεστώ σε μια μικρή εισαγωγή για το φοβερό RaspberryPi SBC, ωστόσο για όσους θέλουν μάθουν περισσότερα, μπορούν να βρουν κάποια πολύ καλά άρθρα στο OSArena αλλά και πληροφορίες στο επίσημο site raspberrypi.org.

File:RaspberryPi.jpg

Η καρδιά του συστήματος είναι το SoC της Broadcom BCM2835 με ARM επεξεργαστή και 256/512MB μνήμη (model A/B), επεξεργαστή γραφικών με έξοδο hdmi (video+audio out), 2 x USB OTG, Ethernet και SD card reader. Ένα από τα βασικά του χαρακτηριστικά είναι το GPIO τα οποία είναι προγραματιζόμενα pin επέκτασης εισόδου/εξόδου και μέσω των οποίων μπορούμε να επικοινωνήσουμε με το φυσικό κόσμο όπως ακριβώς και με το Arduino. Πολλές διανομές Linux υποστηρίζουν ήδη το RaspberryPi. Και όλα αυτά με τιμή που τα σπάει στα 35$ !

Για το project, θα χρησιμοποιήσουμε τη γλώσσα Processing στο RaspberryPi, θα συνδέσουμε το Arduino με USB και θα εκτελέσουμε ένα πρόγραμμα ελέγχου του Arduino (ανάγνωση θερμοκρασίας από το LM35 και άναμμα ενός LED) από το RasberryPi, μέσω ενός γραφικού εργαλείου (ιδέα του scruss).

Τα βήματα:

  1. φορτώνουμε τo Occidentalis 0.2 Linux που έφτιαξε η  adafruit και έχει πολλά εργαλεία για makers στην SD, οδηγίες.
  2. ενημέρωση συστήματος:
    $ sudo apt-get update
    $ sudo apt-get upgrade
    $ sudo rpi-update
    
  3. εγκατάσταση της Java (open-jdk):
    $ sudo apt-get install librxtx-java openjdk-6-jdk
    
  4. κατέβασμα της Processing για linux και αποσυμπίεση σε ένα φάκελο πχ στο /home/pi
  5. διαγραφή του φακέλου java/ μέσα από το φάκελο του processing πχ για μένα στο processing-1.5.1/java
  6. αντί του φακέλου java, δημιουργία συντόμευσης στη java της εγκ/σης(βήμα 3):
    $ ln -s /usr/lib/jvm/java-6-openjdk-armhf java 
  7. διαγραφή μέσα στο φάκελο του processing του: modes/java/libraries/serial/library/linux32/librxtxSerial.so 
  8. αντικατάσταση του: modes/java/libraries/serial/library/RXTXcomm.jar με ένα αντίγραφο του: /usr/share/java/RXTXcomm.jar
  9. κατέβασμα και εγκατάσταση της βιβλιοθήκης controlP5 του Processing.
  10. κατέβασμα και εγκατάσταση της βιβλιοθήκης Arduino του Processing.
  11. εγκατάσταση του Arduino IDE για χρήση της firmata
    $ sudo apt-get install arduino
    
  12. σύνδεση του arduino με το RasberryPi με καλώδιο USΒ.

Για ένα τεστ της επικοινωνίας εκτελούμε τον κώδικα στο Processing:
import processing.serial.*;
import cc.arduino.*;
 
Arduino arduino;
println(Arduino.list());
που μας επιστρέφει το όνομα της θύρας επικοινωνίας πχ. [0] /dev/ttyUSB0.



τώρα μπορούμε να συνδέσουμε το LM35 στο Analog Pin 0 και το LED στο Digital PWM Pin 3 του Arduino.

φόρτωση κώδικα firmata (File->examples->firmata->standardfirmata)




To πρόγραμμα Processing:

import processing.serial.*;
import cc.arduino.*;
import controlP5.*;
ControlP5 controlP5;
Arduino arduino;
 
int ledPin = 3;       // digital 3; PWM capable
int lm35pin = 0;      // analogue 0
int brightness=128;   // LED brightness, 0-255
int lastbrightness=0; // store brightness to stop flicker
 
void setup()
{
  size(250, 50);
  controlP5 = new ControlP5(this);
  // horizontal controlP5 slider bound to brightness variable
  controlP5.addSlider("brightness",0,255,128,90,12,128,16);
  // set up first Arduino we find
  arduino = new Arduino(this, Arduino.list()[0]);
  arduino.pinMode(ledPin, Arduino.OUTPUT);
}
 
void draw() {
  background(240);             // blank screen
  fill(0,0,0);                 // black text
  text("Brightness:", 15, 25); // slider label
  // read LM35 and print
  text("Temperature: " + str(int(read_lm35(lm35pin))) + " °C", 15, 48);
  if (brightness != lastbrightness) {
    // LED flickers if we keep doing analogWrite() with same value
    //  so only write if slider brightness value has changed
    arduino.analogWrite(ledPin, brightness);
  }
  lastbrightness=brightness;
}
 
float read_lm35(int pin) {
  // read lm35 on pin, and return float °C
  // assumes 5V supply, and 0-100°C range
  return (5.0 * arduino.analogRead(pin) * 100.0)/1024.0;
} 

Αν όλα πάνε καλά θα έχετε κάτι σαν το παρακάτω:






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


Καλή επιτυχία!

Σημείωση: Σας προειδοποιώ ότι θα παρατηρήσετε καθυστέρηση καθόλη τη διάρκεια των ενεργειών compile & upload & run που εκτελεί και το Arduino IDE αλλά και το Processing, εξαιτίας της Java που είναι έτσι κι αλλιώς η βάση και των δύο εργαλείων, αλλά σκεφτείτε για λίγο σε τι σύστημα αναπτύσετε και τις δυνατότητες που έχετε και οπλιστείτε με υπομονή ;)

Κυριακή 23 Σεπτεμβρίου 2012

TVout Library test

Σε παλαιότερο post είχαμε μιλήσει για τις δυνατότητες απεικόνισης γραφικών και ήχου με το Gameduino shield. Σε μια πιο απλή-φθηνότερη μορφή, μπορείτε να δοκιμάσετε τη βιβλιοθήκη TVout με την οποία προβάλλετε μηνύματα σε μια τηλεόραση ή οποιαδήποτε οθόνη με είσοδο video in

Η συνδεσμολογία :


Το σήμα Sync με αντίσταση 1ΚΩ συνδέεται στο pin 7 του Arduino.

Το σήμα Video με αντίσταση 470Ω συνδέεται στο pin 9 του Arduino. (εγώ χρησιμοποίησα 2 x 220Ω σε σειρά)



η βιβλιοθήκη πέρα από κείμενο περιλαμβάνει και συναρτήσεις για την παραγωγή γραφικών αλλά και ήχου, παρακάτω ένα demo video :



δείτε και μερικά απλά παιχνίδια:


Κώδικα θα βρείτε εδώ και εδώ.

Καλή επιτυχία!

Τετάρτη 19 Σεπτεμβρίου 2012

Arduino + Chiptunes = Nostalgia!

Η παρακάτω κατασκευή με Arduino είναι πραγματικά εύκολη και γρήγορη στην υλοποίηση και έχει να κάνει με την παραγωγή ήχων...η καλύτερα μουσικής... μέσω των ενσωματωμένων PWM (Pulse Width Modulation) pin. Η λογική απλή, μέσω του κώδικα, οδηγούμε το PWM pin με πολύ γρήγορες εναλλαγές ώστε να παράγει τόνους σε ένα ηχείο.

Η μουσική που παράγεται είναι η χαρακτηριστική των ηλεκτρονικών μηχανών των 80's  (C64, CPC, Spectrum, Amiga, Atari) αυτά τα blip-blop είναι γνωστά ως Chiptune και πραγματικά ξαφνιάστηκα όταν είδα τι σχετικό παράγεται ακόμη. Δεν κρύβω ότι τα συγκεκριμένα ακούσματα μου ξύπνησαν μνήμες από τα παλιά, μια πραγματική Nostalgia!

Για την κατασκευή θα χρειαστείτε:


1 x ηχείο (μικρής ισχύος, ακουστικά ή ακόμη και buzzer) αλλά και ενισχυτής για μεγαλύτερα ηχεία ;)
2 x connector cable (2 καλωδιάκια pin 3+gnd για τη σύνδεση arduino<->speaker)



και φυσικά κώδικα με μουσικά κομμάτια που θα βρείτε εδώ αλλά και εδώ

Αυτό που αλλάζει στα παραδείγματα είναι το byte stream  song_data[] που προκύτπει από τη μετατροπή κομματιών .mod, .mid, .xm, s3m, .sid κτλ που δημιουργήθηκαν από trackers. Στην ουσία πρόκειται για ένα port του player του Linus Akesson στο Arduino. Μπορείτε κι εσείς να δημιουργήσετε κομμάτια και γενικά να πειραματιστείτε όπως σε αυτό το blog.

να και ένα βίντεο:



Σε άλλες υλοποιήσεις γίνεται χρήση του YM2149 ή ενός όλα σε ένα FPGA.


Ok, ξέρω ότι αντί για όλο αυτό, μερικοί θα προτιμούσατε απλά .mp3 αλλά είπαμε, όσο γίνεται πιο κοντά στο πρωτότυπο...

Happy Nostalgia Hacking!


Δευτέρα 13 Αυγούστου 2012

Codebender - Bring the Cloud to your IDE (II)

Το @Codebender_cc είναι ένα νέο και πολλά υποσχόμενο περιβάλλον ανάπτυξης εφαρμογών (IDE) για Arduino στο cloud που αναπτύσσουν τα παδιά από την Πάτρα !


Τα πλεονεκτήματα που αποκτά ένα IDE στο cloud δεν είναι δύσκολο να τα φανταστούμε...

  • Καμία εγκατάσταση λογισμικού στον η/υ
  • Διαχείριση κώδικα online
  • Compile online 
  • Upload sketch στο Arduino μέσω USB ή μέσω δικτύου*
  • Documentation online
  • Libraries built-in
  • cross platform (Linux, OS X, Windows)
  • Your IDE everywhere!
 To project είναι open source και το αποθετήριο βρίσκεται στο Github. Επίσης, υπάρχουν κατατοπιστικά tutorial με video. Το Codebender βασίζεται σε state-of-the-art τεχνολογίες όπως HTML5, Java, CSS3, AWS, Symphony, Ace κτλ.

Κορωνίδα του συστήματος αποτελεί η δυνατότητα φόρτωσης κώδικα στο arduino μέσω δικτύου απομακρυσμένα και η οποία επιτυγχάνεται χρησιμοποιώντας την Ariadne το TFTP-Bootloader που έχει εξελίξει η ομάδα και προς το παρόν μπορούμε να το δούμε σε δράση μόνο σε ένα teaser video:



Το έργο είναι ακόμη closed beta σε φάση pre-register και μέχρι στιγμής πέτυχε τον στόχο που έθεσε ως crowdfunding project!

Keep up the good work!