Progetto torre di hanoi

Salve, avevo intenzione di creare una mini-macchina per la risoluzione del gioco delle torri di hanoi. :) Poi magari, se (sottolineo il se) mi riesce, avevo intenzione di portarlo come progetto per la maturità. (Faccio il 4°ora, di un itis: elettronica e telecomunicazioni)

Non avevo la minima idea di come controllare i vari componenti, avevo pensato ad un plc ma non penso faccia al mio caso. (troppo complesso) Poi girando per la rete ho conosciuto Arduino :D

Per ora non sono capace a programmare micro, ma a me piace programmare quindi non penso sia un problemma imparare (e comunque ho due anni per farlo :))

Quale board mi consigliate di comprare, prima per imparare, e poi per realizzare questo progettino (o anche qualcos'altro se cambiassi idea :roll_eyes:)? Mi stavo orientando su Arduino UNO rev.3 ma, mi servirebbe un consiglio da qualcuno con esperienza xD

Grazie.

legacy:
L’algoritmo l’hai gia’ pensato ?

Si, cioè l’ho pensato (per la parte ricorsiva mi sono anche un pò aiutato con internet :drooling_face:) in C++… penso che andrà pesantemente rivisto…

#include <iostream> 
using std::cout; 
using std::endl; 
using std::cin; 

void hanoi(int, int, int, int); 

int main() 
{ 
    int number; 
    int piniziale; 
    int pfinale; 
    int ptemp; 

    cout << "Inserisci il numero di anelli da spostare: "; 

    cin >> number; 

    cout << "nnInserisci il numero della torre iniziale: "; 
    cin >> piniziale; 

    cout << "nnInserisci il numero della torre finale: "; 
    cin >> pfinale; 

    cout << "nnInserisci il numero della torre temporanea: "; 
    cin >> ptemp; 

    hanoi(number, piniziale, pfinale, ptemp); 

    system ("pause");
    return 0; 
} 

void hanoi(int number, int piniziale, int pfinale, int ptemp) 
{ 

     
    if (number == 1) 
        { 
        cout << "da " << piniziale << " a " << pfinale << endl; 
        return; 
        } 
    else 
    { 
        int ttemp = pfinale; 
        int ttemp2 = piniziale; 
        int ttemp3 = ptemp; 

        int ttemp4 = piniziale; 
        int ttemp5 = pfinale; 
        int ttemp6 = ptemp; 

        hanoi(number - 1, ttemp2, ttemp3, ttemp); 
        cout << "da " << piniziale << " a " << pfinale << endl; 
        hanoi(number - 1, ttemp6, ttemp5, ttemp4); 
        return; 


    } 
}

Pensavo ad un modo per dargli le variabili che chiede via hardware…
Poi per la parte di gestione dei motori, specialmente della loro posizione, ci devo ancora pensare (molto) visto che non sò come fare :slight_smile:

ho letto su wikipedia che è un algoritmo progressivo.

però immagino che il tempo non sia un problema ;)

io ti consiglierei: arduino 2009 (o UNO alla fine il tutto è indifferente anche dalla rev 1 alla 3..) 2 motori stepper + relativo controller 2 guida filettate un servomotore poi un idea che mi è venuta sarebbe farti fare i dischi in materiale conduttore una "pinza" per servo 2 led ir e 2 led ricevitori

usa un po' di fantasia e di dico: vai a dare un occhio alle CNC ;)

comunque il progetto dovrebbe essere fattibile, la programmazione su arduino è moooolto semplice è un simil-c ma portato molto al "parlato" inglese ;)

Per imparare va benissimo la UNO.

Come linguaggio, impara il C classico, poi puoi passare a studiare il Wiring, che è il linguaggio di Arduino, un mix di C/C++ con un sottoinsieme di funzioni specifiche per la gestione dell'HW.

La torre di Hanoi è un algoritmo semplice, in rete trovi miriadi di algoritmi. Ti consiglio, vista la semplicità del microcontrollore che poi dovrai comandare, di studiarti quelli scritti nel vecchio BASIC per i computer ad 8 bit degli anni '80: per il tuo scopo vanno BENISSIMO dato che la gestione del problema non è affogata in centinaia di righe di codice che servono solo a gestire l'interfaccia grafica.

superlol: ho letto su wikipedia che è un algoritmo progressivo.

però immagino che il tempo non sia un problema ;)

io ti consiglierei: arduino 2009 (o UNO alla fine il tutto è indifferente anche dalla rev 1 alla 3..) 2 motori stepper + relativo controller 2 guida filettate un servomotore poi un idea che mi è venuta sarebbe farti fare i dischi in materiale conduttore una "pinza" per servo 2 led ir e 2 led ricevitori

usa un po' di fantasia e di dico: vai a dare un occhio alle CNC ;)

comunque il progetto dovrebbe essere fattibile, la programmazione su arduino è moooolto semplice è un simil-c ma portato molto al "parlato" inglese ;)

Tieni conto che le mie conoscenze sono veramente basilari, e in fatto di motori/sistemi meccanici nulle :drooling_face:

Avevo pensate anche ad una pinza elettromagnetica... :D

Avrò anche bisogno di un sensore di prossimità, per capire quando "afferrare" il disco, adesso come adesso non saprei come farlo senza... visto che ogni volta che sposto un disco cambia la distanza a cui lo deve afferrare, o no?

A cosa servirebbero i led a Infrarossi?

Grazie per i consigli sui componenti, ho ancora molto da imparare :D

leo72: Per imparare va benissimo la UNO.

Come linguaggio, impara il C classico, poi puoi passare a studiare il Wiring, che è il linguaggio di Arduino, un mix di C/C++ con un sottoinsieme di funzioni specifiche per la gestione dell'HW.

La torre di Hanoi è un algoritmo semplice, in rete trovi miriadi di algoritmi. Ti consiglio, vista la semplicità del microcontrollore che poi dovrai comandare, di studiarti quelli scritti nel vecchio BASIC per i computer ad 8 bit degli anni '80: per il tuo scopo vanno BENISSIMO dato che la gestione del problema non è affogata in centinaia di righe di codice che servono solo a gestire l'interfaccia grafica.

Ok! Allora penso proprio che prenderò la UNO :D Per il linguaggi conosco abbastanza bene il C++, quindi spero di non avere grandi problemi...

Non sono riuscito a trovare codice in Basic :. Dici che è più facile applicare la gestione dell'hardware ad un algoritmo in basic, piuttosto a quello postato poco sopra?

p.s. Con il numero di pin non avrò problemi, no? :roll_eyes:

Tiè, beccati questa lista: http://www.kernelthread.com/projects/hanoi// Hanoi in 100 versioni diverse XD

EDIT. ah, ti segnalo anche questa pagina: http://digilander.libero.it/capano/torri_Hanoi/programma_hanoi.htm è in pratica la logica di risoluzione del quiz delle torri

allora guide filettate per muovere un "blocco" che contiene una seconda guida filettata per alzare ed abbassare la pinza, la pinza coi becchi conduttivi così quando tocca iil disco conduce da una parte all'altra :)

poi i led IR sulla prima e ultima torre, così sai quando finisce il programma ;)

legacy:

Mosc:

legacy: L'algoritmo l'hai gia' pensato ?

Si, cioè l'ho pensato (per la parte ricorsiva mi sono anche un pò aiutato con internet :drooling_face:) in C++... penso che andrà pesantemente rivisto...

Fai una prova su arduino e vedi un attimo quanto stack consuma questo approccio ricorsivo per il set + grandi di anelli e torri che intendi spostare.

Purtroppo non ho ancora comperato nulla... :. Ho scoperto solo da poco l'esistenza di Arduino...

leo72: Tiè, beccati questa lista: http://www.kernelthread.com/projects/hanoi// Hanoi in 100 versioni diverse XD

EDIT. ah, ti segnalo anche questa pagina: http://digilander.libero.it/capano/torri_Hanoi/programma_hanoi.htm è in pratica la logica di risoluzione del quiz delle torri

Grazie! Per l'algoritmo in basic... non ci capisco nulla :.

Ora mi informo un pò sulle macchine a controllo numerico... Avevo pensato di usare il numero di "passi" per calcolare la distanza fra un palo e l'altro, ma non sono sicuro funzioni. Ci dovrebbe essere un'altra funzione per decidere quanti passi deve fare, tenendo conto da dove è adesso da dove deve prendere il cerchio e dove lo deve posare... e in quale direzione.... Non mi sembra semplice XD

superlol: allora guide filettate per muovere un "blocco" che contiene una seconda guida filettata per alzare ed abbassare la pinza, la pinza coi becchi conduttivi così quando tocca iil disco conduce da una parte all'altra :)

poi i led IR sulla prima e ultima torre, così sai quando finisce il programma ;)

Cavolo non ci avrei mai pensato, e come "sente" il contatto smette di abbassarsi e chiude la pinza... Circuitalmente non sarei comunque in grado di farlo XD

Riguardo i due led non ho capito... in che senso quando finisce il programma?

anche un paio di sensori di pressione sulla "pinza" potrebbero far comodo. per contare il numero di dischi, un ping sensor (che puoi fare con 2 led, vedi su questo forum) è abbastanza semplice, se sfrutti il fatto che di lato la torer è una scaletta :) e a questo punto diventa anche abbastanza semplice individuare il "palo" in cui inserire l'anello

l'algoritmo p una baggianata, io l'ho scoperto giocandoci, magari non è ottimizzato ma fondamentalmente; se devi spostare una torre di pari anelli, il primo lo metti dove NON vuoi arrivare dei 2 pali liberi, viceversa se dispari. facile no?

lesto: anche un paio di sensori di pressione sulla "pinza" potrebbero far comodo. per contare il numero di dischi, un ping sensor (che puoi fare con 2 led, vedi su questo forum) è abbastanza semplice, se sfrutti il fatto che di lato la torer è una scaletta :) e a questo punto diventa anche abbastanza semplice individuare il "palo" in cui inserire l'anello

l'algoritmo p una baggianata, io l'ho scoperto giocandoci, magari non è ottimizzato ma fondamentalmente; se devi spostare una torre di pari anelli, il primo lo metti dove NON vuoi arrivare dei 2 pali liberi, viceversa se dispari. facile no?

Ma questo vale solo per il primo... o no? e se ti trovi con tutte e tre le torri occupate da anelli che fai? Io non saprei che fare xD

Per individuare il palo, penso, che basti l'algoritmo...

edit. Ahhh, ho capito ora, tu intendevi individuare il palo che ti chiede come variabile...

Piuttosto mi potrebbe far comodo per dirgli quanti sono gli anelli, come variabile richiesta! :open_mouth:

Comunque penso che stiamo andando troppo avanti, non ho ancora nulla in mano, e devo ancora imparare le basi o.o"

legacy: Come non detto, avevo paura che ti mangiasse lo stack ma con una breve simulazione mi sono ricreduto.

--- 2 rings --- steps = 3 max steck step = 2 max stack_size = 48

--- 3 rings --- steps = 7 max steck step = 3 max stack_size = 72

--- 4 rings --- steps = 15 max steck step = 4 max stack_size = 96

--- 5 rings --- steps = 31 max steck step = 5 max stack_size = 120

--- 6 rings --- steps = 63 max steck step = 6 max stack_size = 144

--- 7 rings --- steps = 127 max steck step = 7 max stack_size = 168

--- 8 rings --- steps = 255 max steck step = 8 max stack_size = 192

--- 9 rings --- steps = 511 max steck step = 9 max stack_size = 216

Non sò neanche cos'è uno stack :. edit. Leggendo un pò su wikipedia credo di aver capito.

legacy: Male male, sapere che cosa e' lo stack quali sono i problemi che puo' dare e' la prima cosa che ti devi assolutamente chiarire perche' bada bene che su arduino non hai tutta la ram che hai sul pc, e quando fai "ricorsione" ne puoi consumare parecchia di ram anzi al limite un algoritmo ricorsivo sviluppato e provato sul pc potrebbe consumare piu' della ram fisica che hai su arduino.

Avevo proprio quel dubbio e me lo sono tolto.

Capito, grazie ;)

Ora vedo di ordinare questo UNO, poi incomincio a smanettare un pò XD

Mosc: Quale board mi consigliate di comprare, prima per imparare, e poi per realizzare questo progettino (o anche qualcos'altro se cambiassi idea :roll_eyes:)? Mi stavo orientando su Arduino UNO rev.3 ma, mi servirebbe un consiglio da qualcuno con esperienza xD

Dal punto di vista potenza di calcolo la UNO basta e avanza, la torre di Hanoi è un problema semplice da risolvere dal punto di vista informatico. Quello che è difficile da realizzare per il tuo progetto è la parte meccanica che sposta fisicamente i piatti, il modo più semplice per risolvere è utilizzare un piccolo braccio robot commerciale come quelli di Lynxmotion, però tra braccio e servocontroller vai a spendere qualche centinaio di Euro, anche con altre soluzioni meccaniche la spesa è sempre abbastanza alta. Una soluzione alternativa è utilizzare un rappresentazione grafica della torre, con relative animazioni, su un pc collegato via usb (seriale virtuale) ad Arduino, in pratica Arduino risolve il puzzle mentre il pc muove i pezzi in base ai comandi impartiti da Arduino.

Se parliamo di rappresentazione grafica allora ho la soluzione ancora più semplice ed indipendente dal PC:

3 matrici led di 8x8 affiancate pilotate da 3 MAX7219. I dischi li rappresenti con semplici linee di led accesi. Ecco un esempio:

Ecco la disposizione iniziale per 3 dischi:

........................
........................
........................
........................
........................
...**...................
..****..................
.******.................

Qui abbiamo già spostato un paio di volte i dischi più piccoli:

........................
........................
........................
........................
........................
........................
...**...................
.******...****..........

astrobeed:

Mosc: Quale board mi consigliate di comprare, prima per imparare, e poi per realizzare questo progettino (o anche qualcos'altro se cambiassi idea :roll_eyes:)? Mi stavo orientando su Arduino UNO rev.3 ma, mi servirebbe un consiglio da qualcuno con esperienza xD

Dal punto di vista potenza di calcolo la UNO basta e avanza, la torre di Hanoi è un problema semplice da risolvere dal punto di vista informatico. Quello che è difficile da realizzare per il tuo progetto è la parte meccanica che sposta fisicamente i piatti, il modo più semplice per risolvere è utilizzare un piccolo braccio robot commerciale come quelli di Lynxmotion, però tra braccio e servocontroller vai a spendere qualche centinaio di Euro, anche con altre soluzioni meccaniche la spesa è sempre abbastanza alta. Una soluzione alternativa è utilizzare un rappresentazione grafica della torre, con relative animazioni, su un pc collegato via usb (seriale virtuale) ad Arduino, in pratica Arduino risolve il puzzle mentre il pc muove i pezzi in base ai comandi impartiti da Arduino.

quoto in pieno l'idea di usare un braccio già fatto, altrimenti se non hai mecchine CNC a disposizione o un'ottima manualità nella lavorazione di plastiche, legno o alternative è più il tempo perso che i soldi risparmiati (e il tempo è denaro...)

in olte il braccio lo usi anche per altri progetti, tipo un grattaschiena automatico :)

MMmhh... no volevo fare qualcosa d'effetto, magari per portarlo anche come progetto alla maturità... ... Senza spendere un capitale :sweat_smile:

Se mi dite che la parte meccanica è troppo complessa, cerco di pensare a qualcos'altro :D

legacy:

Mosc:
MMmhh… no volevo fare qualcosa d’effetto, magari per portarlo anche come progetto alla maturità…

Se vuoi un consiglio: risparmiati la faticaccia e conserva quattrici ed energia per farti poi un viaggio vacanza, magari dove si parla inglese (tipo UK o irlanda), al posto di diventar matto e buttar via soldi per mendo di 10 minuti di gloria in cui somatizzerai sicuramente un vuoto totale da parte dei tuoi interlocutori che capiranno quanto hai fatto solo parzialmente (e forse nemmeno).

Portai una scheda a micro nel 1999 quando non c’era mica ne arduino ne il pcb toner transfer, una faticaccia fare quella schedina e una spesa non indifferente. Era perfettamente funzionante e abbondantemente documentata in una tesina di 200 pagine.

Per critica mi dissero che mancavano le fotine e le slide =’(
E io ricordo ancora la sola domanda che mi fu fatta, la piu’ imbarazzante che mi fecero in tutta la mia carriera:

“ma quell’affare l’hai mai acceso ? Non e’ che fa la fumata bianca ? E non e’ che mi spacca il pc se lo colleghi alla mia seriale ?”

Non si era nemmeno accordo che che fino a que in quel momento stava mantenendo stabile la temperatura di 40 gradi ±0.5 gradi.

Misi la tesina sul tavolo e passai all’istante a parlare del ritratto di Dorian Gray e di Oscar Wilde con la prof di inglese.

Tempo totale meno di 10 minuti.

Per cui, tornassi indietro passerei il tempo a studiarmi un iter per farmela in tredo in giro per l’europa investendo quei soldi per acquistare il primo biglietto del treno, o lastminute airline.

Oh mio dio… che brutta esperienza :drooling_face:
Spero che i miei prof non si comportino così, durante questi anni hanno sempre svolto molto bene il loro compito… C’è il pericolo dell’esterno però… xD

Mi hai convinto a non spendere troppo per il progetto, ma voglio fare comunque qualcosa d’effetto, se poi loro non lo apprezzano fa niente… intanto ho fatto quello che potevo (e imparato nuove cose…) XD

Devo solo pensare ad un qualcosa che non richieda una parte meccanica complessa… :roll_eyes:

legacy: L'idea di leo e' perfetta! E costa poco.

Ho appena preso gli stessi integrati da RS. Ho visto che ci sono su ebay; c'e' un tizio a roma che li vente e ti arrivano in 2-4 giorni. In questo momento vedo che ha 3 aste, o integrato singolo, o confezione da 6, o da 10. Costano poco e fanno quello che devono: pilotano una matrice di led senza farti impazzire con troppi fili. Infatti e' una configurazione seriale. Ti servirebbero solo le matrici di led, e anche quelle le trovi facilmente e ti costano poco.

Fai bella figura, impari un sacco di cose, e con tutte quelle lucine che si accendono e spengono sul grid puoi allacciarti alla storia informatica, se ti va.

Sarebbe una versione ampliata di questo?: http://www.youtube.com/watch?v=B2Vu69B6FfU

Un pò mi spaventa, non ho la minima idea di cosa sia sta roba :cold_sweat: Però penso che andrà bene come progetto... :drooling_face:

Volendo potrei rappresentarci anche più cose, non solo la risoluzione della torre di hanoi... Tutto sta nel capire cos'è, come funziona, come si usa :blush:

Avete qualche link per caso? XD

edit. Elettrotecnica e sistemi esterni? :relaxed: Nella mia scuola non penso sia mai capitato, misà che hai avuto davvero sfortuna...

non c'e' paragone con il braccio meccanico, che farebbe molto piu' effetto. Io da prof ti darei 6 con questi leddini sfigati, e 10 con il braccio :)

Testato: non c'e' paragone con il braccio meccanico, che farebbe molto piu' effetto. Io da prof ti darei 6 con questi leddini sfigati, e 10 con il braccio :)

E pure te hai ragione... :drooling_face:

Vabbè intanto faccio (leggi: provo a fare) questo, penso che una cosa del genere può sempre diventare un "aggiunta" ad un altro progetto...

Seguendo i collegamenti del video sopra sono arrivato ai "cubi di led" che figata xD (anche se non penso vada bene come progetto)

legacy:

Testato: non c'e' paragone con il braccio meccanico, che farebbe molto piu' effetto. Io da prof ti darei 6 con questi leddini sfigati, e 10 con il braccio :)

E meno male che non fai il prof perche' questa e' una colossale frignaccia, tant'e' che io ti darei 2 in strategia: si chiama ottenere il massimo del risultato con la minore spesa, prima leazione di che fa il progettista e non vuole passare la vita a farsi sfruttare dai commerciali, e tu stai consigliando di mandare un gundam a schiacciare le mosche?

Ma hai una vaga idea di quanto tempo e quattrini costi ? E hai una vaga idea di quanto ai prof gliene freghi qualcosa ?

Leddini sfigati dici tu, io dico massima resa a minore spesa perche' se ti fai quattro conti col braccetto maccanico e il resto appresso stiamo parlando di 200 euro e almeno 4 mesi di lavoro-tra le menate che ci sono a scuola per portare a casa in commissione al piu' 5 punti di bonus.

E' un rapporto impresa/resa che ha una efficienza talmente scarsa da essere sull'orlo della barzelletta specialmente se ti becchi la commissione sfigata come la mia per la quale puoi pure portargli un gundam in scala 1:1, ovviamente funzionante non solo bella statuina, che tanto non te lo considerano manco di striscio perche' comunque quell'attivita' e' (a MUST) subordinata a quanto ti sei preparato in italiano, inglese, letterature varie, matematica e altre amenita' tipiche delle superiori rispetto alla sbatta coi sudori alla fronte che avresti il piacere di sbattergli in faccia giusto per fargli vedere che tu le cose le sai fare.

Ora c'e' anche che, commissione sfigata a parte, il problema e' che comuque alla maturita' non dimostri nulla facendo vedere che tu le cose le sai anche fare, perche' non lo dimostri se non dopo che inizi a lavorare facendo - di cio' che ti piace e sai fare - cio' che ti porta la pagnotta a casa.

Il mio semplice parere, ovviamente puoi ognuno faccia come meglio crede.

Nono, hai perfettamente ragione XD

Il punto è che anche a me, mettendomi nei panni della commissione, colpirebbe di più una qualsiasi macchina automatizzata, anche semplice, che dei LED, per quanto possa essere complessa e lunga tutta la logica e il lavoro che c'è dietro. Quindi vorrei trovare qualcosa che faccia effetto spendendo il meno possibile... Avevo pensato alla torre di hanoi perchè è la prima cosa che mi è venuta in mente, se non mi conviene realizzarlo nulla mi impedisce di cambiare idea orientandomi su qualcos'altro XD

edit. E poi, come dire, la vedo come una buona scusa per incominciare a smanettare per conto mio, visto che fino ad ora non ho fatto praticamente nulla, limitandomi ai laboratori di elettronica/elettrotecnica/tdp. Giusto a sistemi ho studiato un pò di programmazione ad oggetti in C++ per conto mio :)