lunedì 20 gennaio 2014

Arduino Project 0: Laser






Mentre lavoravo in cantina l'autunno passato mi sono fatto un viaggio. Cioè oddio ad essere sinceri me ne sarò fatto anche più d'uno, peró me ne sono fatto uno in particolare. Avevo preso Arduino da poco e pensavo a qualcosa di simpatico da realizzare. 

Siccome quest'estate mi sono improvvisato come dilettante DJ in un bar, spistolavo spesso con questo bagaglio:



Un controller MIDI di qualità infima studiato per rendere drammaticamente facile il lavoro del Disk Jockey assieme a Traktor che invece é il programma che uso nel computer per riprodurre le canzoni.

Molto bene

I concetti su cui mi sono focalizzato erano la parola Controller e la parola MIDI.

Controller: un qualcosa che controlla, nel senso che impartisce comandi, anzi che impartisce vari tipi di comandi attraverso i suoi vari bottoni e levette. 

MIDI: come dice wikipedia: protocollo standard per l'interazione degli strumenti musicali elettronici (anche tramite un computer). Un protocollo di comunicazione standard. 

E allora mi son detto "Cazzo", ma se riesco a percepire i comandi che il controller invia al computer, in qualche modo li potrò inviare ad Arduino, e siccome Arduino può impartirli a qualsiasi cosa, il mio pensiero "Cazzo ma che sborata" fu.

Così é nato questo progetto il quale ha dato alla luce questo oggetto:







Ma che cos'é?

Definizione 1: Sono delle mini teste mobili controllabili da un controller MIDI. 
Definizione 2: Sono dei Laser montati su dei motori controllati da un controller MIDI.

Subito mostro un video per mostrare il tutto funzionante così ci capiamo al volo:









I componenti dell'oggetto sono semplici, si tratta di due coppie di servo motori, e una coppia di di Laser.

Ogni coppia di servo motori é assemblata in modo tale da consentire il movimento orizzontale e il movimento verticale dei laser, in questo modo si ha un vasta gamma di movimenti possibili.

I laser invece sono i più comuni puntatori che si trovano in giro, presi su eBay a cifre abbordabilissime. Come é possibile notare dalle foto, a questi laser ho rimosso la parte posteriore, dove ci starebbero le pile, perché ho voluto a tutti costi alimentarli esternamente non volendo affidarmi alla precarietà delle pile, per fare questo ho preso degli alimentatori universali e li ho settati a 3 volt: 





Munito di stagnatore e  di immancabile Bostik ho unito il tutto.

Su Arduino invece é montato un  Arduino Motor Shield, ovvero una placca indirizzata all'alimentazione di motori che presenta alcune prese di tipo TinkerKit. Questo in realtá é stato un incauto acquisto che ho fatto senza informarmi bene per cui si é rivelato di scarsa utilità e assolutamente non essenziale ai fini del progetto. In pratica ho preso questo Shield perché non sapevo dell'esistenza del TinkerKit Sensor Shield, cercavo ciòé un modo per attaccare velocemente i servo motori ad Arduino, solo che di prese TinkerKit in Output ne ha solo due, per cui ha risolto metá dei miei problemi. Va bé succede.







Per ultimo ma non per merito c'é Arduino ovviamente.

Il progetto di per se non é complicato, erano solo due i punti su cui dovevo indagare:

- Come diavolo prendere i comandi che il controller invia al computer
- Come diavolo inviare i comandi dal computer ad Arduino.

Dopo varie ricerche su internet ho trovato le nozioni necessarie e così ho fatto il programma che interfaccia i due macro sistemi.

Il programma l'ho chiamato bCTRL, lascio all'immaginazione dei lettori il significato della b, mentre CTRL é la sigla che troviamo su tutte le tastiere del mondo ed é l'abbreviazione di Control.

Il programma l'ho realizzato per mac, per windows non ho idea di come si possa fare. Fatto sta che tra le tante librerie in xCode c'é la libreria CoreMIDI che appunto consente di interfacciarsi con dispositivi esterni che lavorano attorno a quella specifica. Su internet ho trovato del codice già pronto  che permetteva tutto questo per cui l'ho preso e l'ho modificato opportunamente per i miei scopi.
Per inviare comandi dal computer ad Arduino invece é stato più semplice perché il tutto si risolve con una riga di codice:


                popen("echo [value] > /dev/cu.usbmodemfa121", "r");


Dove al posto del placeholder [value] è possibile un inserire un valore o carattere che sarà correttamente inviato ad Arduino, mentre /dev/cu.usbmodemfa121 non è altro che la porta seriale alla quale Arduino è attaccato sul momento.

Qui lascio un video in cui muovo un solo motore:





Come dicevo prima, il controller ha vari tipi di manopole, ma possono essere tutte suddivise in due insiemi:

- L'insieme delle manopole a valori finiti
- L'insieme delle manopole a valori infiniti

Ci sono cioè manopole che hanno un certo range di valori, come quelle degli alti e bassi o gli slider:






Ci sono invece manopole che girano all'infinito come questa:




o questa:





le quali non danno un valore in particolare ma semplicemente indicano se le stai girando in senso orario o meno. É proprio su queste ultime che mi sono concentrato per comodità.

La struttura del programma é veramente semplice, non fa altro che prendere un comando dal controller e inviare direttamente una propria rappresentazione del comando ad Arduino. Non scendo troppo nei dettagli perché sarei palloso comunque per questo motivo non sono stato neanche a fargli una Graphic User Interface (Yo). 


L'aspetto del progetto che non ho ancora trattato é il circuito:





Anche il circuito é semplice, ma é un po lungo da fare in Fritzing per cui non ho avuto il cuore di trasporlo in un formato più facilmente interpretabile. Esso ha il compito di gestire due dei quattro motori, quelli che non ho potuto attaccare sullo Shield ( -.- ) e di permettere l'accensione e lo spegnimento dei laser sempre attraverso il controller, e questo é reso possibile grazie ai due transistor visibili in foto:



Che dire mi sono divertito e ho imparato cose nuove, un giorno mi piacerebbe avere l'occasione di usarlo tipo in una festa.


Per concludere lascio il link al video tamarro che ho fatto per presentarlo:







Saluti 
Beto

Nessun commento:

Posta un commento