Il mio primo pensiero riguardo la realizzazione del braccio meccanico era quello di progettare la base rotante su cui esso sarebbe stato montato.
Motoriduttore con trasduttore di posizione angolare
La rotazione della base, similmente ad una “spalla” biologica, doveva essere controllata e calibrata dal computer in modo tale che il braccio si potesse orientare in qualsiasi direzione. C’erano due possibili soluzioni: optare per un motore passo passo oppure utilizzare un motoriduttore accoppiato ad un encoder.
I sistemi operativi Gnu/Linux forniscono un set completo di funzioni C per la gestione dell’hardware.
Per controllare la porta parallela saranno sufficienti solo tre funzioni:
int ioperm( unsigned long port, unsigned long num, int on_off ): modifica i permessi di accesso alla porta.
short int inb( short int port ) : legge i dati dalla porta.
void outb ( short int val, int port ) : scrive i dati sulla porta.
Ricordiamoci inoltre di verificare se i permessi dell’utente consentono l’accesso alla porta e se necessario reimpostiamoli.
La porta parallela ci consente di trasmettere fino a un byte di dati per volta.
Possiamo trovare il suo indirizzo all’interno della nostra macchina controllando il file /proc/ioports, alla voce lp o parport.
/*
Title: Esempio di gestione della porta parallela - porta_parallela.cpp
Author: "Giacomo Trudu" aka "Wicker25" - wicker25[at]gmail[dot]com
Site: http://www.hackyourmind.org/
License: GNU General Public License (GPL)
Description: An example of parallel port interfacing
*/
#include <iostream>
#include <cstdio>
#include <sys/io.h>
#define PARPORT_ADDRESS 0x378 // L'indirizzo della porta
#define DATA PARPORT_ADDRESS + 0 // Registro dei dati
#define STATUS PARPORT_ADDRESS + 1 // Registro di stato (sola lettura)
#define CONTROL PARPORT_ADDRESS + 2 // Registro di controllo (sola scrittura)
using namespace std;
int main( ) {
// Ricavo l'user id ...
int uid = geteuid();
// ... e se ce ne bisogno imposto i privilegi di root
if (uid) setreuid( 0, 0 );
// Abilito la porta parallela
if ( ioperm( DATA, 3, 1 ) < 0 ) {
cout << "Impossibile abilitare la porta." << endl;
return 1;
}
// Revoco i permessi di root
setreuid( uid, uid );
// Scrivo nella porta (0000 0011)
outb( 0x03, DATA );
// Leggo dalla porta
inb( STATUS );
// Scrivo nella porta (0000 0011)
outb( 0x00, DATA );
return 0;
}
Agli inizi di quest’anno decisi che avrei finalmente iniziato a lavorare con gli automi: in particolare era mio interesse dedicarmi alla robotica, scienza che mi ha sempre incuriosito ed appassionato fin da quand’ero bambino.
Adesso ho la possibilità di avvicinarmi a questa nuova e stimolante materia (come potete vedere nel video sottostante)..
Servomotore via porta parallela
Ho già in mente un progetto che mi aiuterà a fondere le mie conoscenze informatiche con le nuove acquisite nell’ambito dell’elettronica.
Nei prossimi giorni, quindi, pubblicherò video, schemi e sorgenti relativi al mio nuovo lavoro che avrà come obiettivo la realizzazione di un arto controllato tramite porta parallela, in grado di giocare ad un gioco da tavolo (probabilmente dama).
Comincio subito con un progetto tanto ambizioso quanto stimolante che avrà un suo preciso contenuto didattico: progetterò l’hardware e il software, un gradino alla volta, analizzando e risolvendo ogni singolo problema che mi si porrà davanti.