<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="it">
	<id>https://www.raspibo.org/wiki/index.php?action=history&amp;feed=atom&amp;title=RaspiRuga</id>
	<title>RaspiRuga - Cronologia</title>
	<link rel="self" type="application/atom+xml" href="https://www.raspibo.org/wiki/index.php?action=history&amp;feed=atom&amp;title=RaspiRuga"/>
	<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=RaspiRuga&amp;action=history"/>
	<updated>2026-05-05T02:53:19Z</updated>
	<subtitle>Cronologia della pagina su questo sito</subtitle>
	<generator>MediaWiki 1.35.5</generator>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=RaspiRuga&amp;diff=2235&amp;oldid=prev</id>
		<title>Oloturia: /* Il video */</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=RaspiRuga&amp;diff=2235&amp;oldid=prev"/>
		<updated>2014-01-26T15:07:35Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Il video&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left diff-editfont-monospace&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;it&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Versione meno recente&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Versione delle 15:07, 26 gen 2014&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l175&quot; &gt;Riga 175:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Riga 175:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  		stepper2.started = False&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  		stepper2.started = False&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;= Il video =&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;= Il video =&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[http://www.youtube.com/watch?v=IlGY5-Tbwzs&amp;amp;feature=youtu.be|Funzionamento base della Raspiruga]&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[http://www.youtube.com/watch?v=IlGY5-Tbwzs&amp;amp;feature=youtu.be| Funzionamento base della Raspiruga]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Oloturia</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=RaspiRuga&amp;diff=2234&amp;oldid=prev</id>
		<title>Oloturia: Creata pagina con 'Raspiruga è un robottino ideato per sperimentare due cose: un primo abbozzo di chassis fatto con la stampante 3d e l'impiego di motori passo-passo per ottenere più precision...'</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=RaspiRuga&amp;diff=2234&amp;oldid=prev"/>
		<updated>2014-01-26T15:06:52Z</updated>

		<summary type="html">&lt;p&gt;Creata pagina con &amp;#039;Raspiruga è un robottino ideato per sperimentare due cose: un primo abbozzo di chassis fatto con la stampante 3d e l&amp;#039;impiego di motori passo-passo per ottenere più precision...&amp;#039;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nuova pagina&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Raspiruga è un robottino ideato per sperimentare due cose: un primo abbozzo di chassis fatto con la stampante 3d e l'impiego di motori passo-passo per ottenere più precisione nel movimento. &lt;br /&gt;
&lt;br /&gt;
[[File:Raspiruga.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Componenti =&lt;br /&gt;
*    Due motori passo-passo (attualmente usati i 28BYJ-48[1], sono poco potenti ma estremamente economici)&lt;br /&gt;
*    Due driver ULN2003, per i motori passo-passo&lt;br /&gt;
*    Un Raspberry Pi (al momento Mod. B, ma spero di passare al Mod. A al più presto) dotato di relativo modulo cam e adattatore Wi-Fi USB&lt;br /&gt;
*    Un caricabatterie di emergenza a 4 pile AA/stilo, usato per alimentare il Raspberry Pi&lt;br /&gt;
*    Una mucchia di Lego®&lt;br /&gt;
*    Ruote, stampate 3d! E due sedi per i motori, compatibili con i Lego® che compongono il resto dello chassis, sempre stampati 3d!&lt;br /&gt;
*    Un servo e una biro, per scrivere&lt;br /&gt;
&lt;br /&gt;
= Il nostro nuovo amico, il motore passo-passo =&lt;br /&gt;
Il motore passo-passo è un tipo particolare di motore elettrico. Invece di muoversi continuamente, si sposta di una frazione di angolo alla volta grazie a dei magneti attivati in successione, risultando così estremamente preciso nel suo movimento. Per contro velocità troppo alte potrebbero far saltare un passo. Potete trovare online parecchia documentazione a riguardo soprattutto per Arduino [2] ma usarlo con Raspberry Pi è altrettanto semplice. &lt;br /&gt;
&lt;br /&gt;
[[File:Passopassopiccolo.jpg]]&lt;br /&gt;
Sulla destra ci sono i collegamenti per l'alimentazione (5v e terra), in basso sette pin collegati al ULN2003, dei quali saranno utilizzati solo i primi quattro. A questi pin si possono collegare direttamente le uscite della GPIO del Raspberry Pi.&lt;br /&gt;
&lt;br /&gt;
Per far girare un motore passo occorre alimentare un magnete alla volta. Per migliori risultati è meglio alimentare il magnete successivo prima di spegnere quello precedente. La sequenza è questa:&lt;br /&gt;
&lt;br /&gt;
1, 1-2, 2, 2-3, 3, 3-4, 4, 4-1&lt;br /&gt;
&lt;br /&gt;
 1- 1 1 0 0 0 0 0 1&lt;br /&gt;
 2- 0 1 1 1 0 0 0 0&lt;br /&gt;
 3- 0 0 0 1 1 1 0 0 &lt;br /&gt;
 4- 0 0 0 0 0 1 1 1&lt;br /&gt;
&lt;br /&gt;
Ovviamente per far girare il motore nell'altro senso occorre invertire la sequenza.&lt;br /&gt;
&lt;br /&gt;
La velocità del motore è data dall'intervallo fra un passo della sequenza e l'altro. Il limite per non far saltare i passi (per la precisione di python) è circa 0,001 secondi.&lt;br /&gt;
&lt;br /&gt;
= Scrivere =&lt;br /&gt;
Ora la Raspiruga scrive! Un servo, una biro inutilizzata, et voilà!&lt;br /&gt;
&lt;br /&gt;
[[File:Raspiruga writer1.jpg]]&lt;br /&gt;
&lt;br /&gt;
= Il codice, pasticciato e brutto =&lt;br /&gt;
&lt;br /&gt;
Le librerie usate per questo robottino sono:&lt;br /&gt;
&lt;br /&gt;
*    wiringpi2 [https://github.com/Gadgetoid/WiringPi2-Python] derivata da WiringPi di Gordon &amp;quot;Drogon&amp;quot; [https://projects.drogon.net/]&lt;br /&gt;
*    time per la gestione delle temporizzazioni&lt;br /&gt;
*    threading per la gestione dei thread&lt;br /&gt;
*    subprocess per call, utile per richiamare comandi bash da dentro python, nello specifico serve per dare i comandi a ServoBlaster [https://github.com/richardghirst/PiBits/tree/master/ServoBlaster] per muovere i servo. Sui servo potete trovare più informazioni qui Servo (radio control). &lt;br /&gt;
&lt;br /&gt;
I thread sono indispensabili in questo caso perché i due motori devono muoversi contemporaneamente. Ricordatevi di farli terminare quando il programma finisce perché altrimenti rimarranno attivi.&lt;br /&gt;
&lt;br /&gt;
Questo programmino chiede all'utente la velocità, la direzione e la durata del movimento. Un altro parametro del movimento, la variabile accel della classe movement, è fissa a 10. A cosa serve accel? È il numero di passi richiesti per raggiungere la velocità richiesta a partire da 0,1 secondi. In questo modo l'accelerazione sarà progressiva e i motori non saranno sottoposti a sforzi eccessivi. La direzione è data dai comandi &amp;quot;fd&amp;quot; (forward), &amp;quot;bk&amp;quot; (back), &amp;quot;lt&amp;quot; (left), &amp;quot;rt&amp;quot; (right), la velocità da un numero superiore a 0 (il risultato è 1/velocità, es. velocità 20 corrisponde a 0,05 secondi). I comandi &amp;quot;pu&amp;quot; (pen up) e &amp;quot;pd&amp;quot; (pen down) servono per comandare il servo con la penna. Il demone servod deve stare nella stessa cartella di questo codice (oppure dovrete segnare il path nella chiamata call([&amp;quot;sudo ./servod&amp;quot;],shell=True)). Inoltre, per comodità, ho disattivato tutti i pin comandati da ServoBlaster tranne uno, il pin P1-7 (che corrisponde al pin 7 wiringpi), in modo da avere gli altri pin disponibili per altri scopi. La lista di pin è modificabile nel sorgente servod.c alla riga 156.&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 #pin 11,10,6,5 motore 1&lt;br /&gt;
 #pin 14,13,12,3 motore 2&lt;br /&gt;
 &lt;br /&gt;
 import wiringpi2 as wiringpi&lt;br /&gt;
 import time&lt;br /&gt;
 import threading&lt;br /&gt;
 from subprocess import call&lt;br /&gt;
 &lt;br /&gt;
 class movement(threading.Thread):&lt;br /&gt;
 	accel = 10&lt;br /&gt;
 	realspeed = 0.1&lt;br /&gt;
 	decremento = 0.1&lt;br /&gt;
 	go = False&lt;br /&gt;
 	started = False&lt;br /&gt;
 	avanti = False&lt;br /&gt;
 	def run(self):&lt;br /&gt;
 		while self.started:&lt;br /&gt;
 			if self.go:&lt;br /&gt;
 				self.decremento = (self.realspeed-speed)/self.accel&lt;br /&gt;
 				wiringpi.digitalWrite(self.motor[self.ix],1)&lt;br /&gt;
 				self.px = self.ix&lt;br /&gt;
 				if self.avanti:&lt;br /&gt;
 					self.ix +=1&lt;br /&gt;
 				else:&lt;br /&gt;
 					self.ix -=1&lt;br /&gt;
 				if (self.ix == 4):&lt;br /&gt;
 					self.ix = 0&lt;br /&gt;
 				if (self.ix == -1):&lt;br /&gt;
 					self.ix = 3&lt;br /&gt;
 				time.sleep(self.realspeed)&lt;br /&gt;
 				wiringpi.digitalWrite(self.motor[self.ix],1)&lt;br /&gt;
 				time.sleep(self.realspeed)&lt;br /&gt;
 				wiringpi.digitalWrite(self.motor[self.px],0)&lt;br /&gt;
 				if self.realspeed &amp;gt; speed:&lt;br /&gt;
 					self.realspeed -= self.decremento&lt;br /&gt;
 				else:&lt;br /&gt;
 					self.realspeed = speed&lt;br /&gt;
 			else:&lt;br /&gt;
 				for x in self.motor:&lt;br /&gt;
 					wiringpi.digitalWrite(x,0)&lt;br /&gt;
 				self.realspeed = 0.1&lt;br /&gt;
 &lt;br /&gt;
 wiringpi.wiringPiSetup()&lt;br /&gt;
 wiringpi.pinMode(11,1)&lt;br /&gt;
 wiringpi.pinMode(10,1)&lt;br /&gt;
 wiringpi.pinMode(6,1)&lt;br /&gt;
 wiringpi.pinMode(5,1)&lt;br /&gt;
 wiringpi.pinMode(14,1)&lt;br /&gt;
 wiringpi.pinMode(13,1)&lt;br /&gt;
 wiringpi.pinMode(12,1)&lt;br /&gt;
 wiringpi.pinMode(3,1)&lt;br /&gt;
 &lt;br /&gt;
 stepper1 = movement()&lt;br /&gt;
 stepper2 = movement()&lt;br /&gt;
 &lt;br /&gt;
 stepper1.motor = [10,11,6,5]&lt;br /&gt;
 stepper2.motor = [14,13,12,3]&lt;br /&gt;
 stepper1.go = False&lt;br /&gt;
 stepper2.go = False&lt;br /&gt;
 stepper1.started = True&lt;br /&gt;
 stepper2.started = True&lt;br /&gt;
 stepper1.start()&lt;br /&gt;
 stepper2.start()&lt;br /&gt;
 direction =&amp;quot;&amp;quot;&lt;br /&gt;
 denominator = 1.0&lt;br /&gt;
 call([&amp;quot;sudo killall servod&amp;quot;],shell=True)&lt;br /&gt;
 call([&amp;quot;sudo ./servod&amp;quot;],shell=True)&lt;br /&gt;
 &lt;br /&gt;
 while (direction !=&amp;quot;quit&amp;quot;):&lt;br /&gt;
 	for x in stepper1.motor:&lt;br /&gt;
 		wiringpi.digitalWrite(x,0)&lt;br /&gt;
 	for x in stepper2.motor:&lt;br /&gt;
 		wiringpi.digitalWrite(x,0)&lt;br /&gt;
 	direction = raw_input(&amp;quot;action?(fd/bk/lt/rt/pu/pd/quit) &amp;quot;)&lt;br /&gt;
  	if direction != &amp;quot;fd&amp;quot; and direction != &amp;quot;bk&amp;quot; and direction !=&amp;quot;lt&amp;quot; and direction !=&amp;quot;rt&amp;quot; and direction !=&amp;quot;pu&amp;quot; and direction !=&amp;quot;pd&amp;quot; and direction !=&amp;quot;quit&amp;quot;:&lt;br /&gt;
 		print &amp;quot;only fd,bk,lt,rt,pu,pd,quit&amp;quot;&lt;br /&gt;
 		continue&lt;br /&gt;
 	if direction != &amp;quot;quit&amp;quot;:&lt;br /&gt;
 		if direction != &amp;quot;pu&amp;quot; and direction !=&amp;quot;pd&amp;quot;:&lt;br /&gt;
 			try:&lt;br /&gt;
 				denominator = input(&amp;quot;speed?(number, 0 exit) &amp;quot;)&lt;br /&gt;
 			except NameError:&lt;br /&gt;
 				print &amp;quot;only numbers&amp;quot;&lt;br /&gt;
 				continue&lt;br /&gt;
 			try:&lt;br /&gt;
 				duration = input(&amp;quot;duration?(seconds) &amp;quot;)&lt;br /&gt;
 			except NameError:&lt;br /&gt;
 				print &amp;quot;only numbers&amp;quot;&lt;br /&gt;
 				continue&lt;br /&gt;
 		if direction == &amp;quot;bk&amp;quot;:&lt;br /&gt;
 			stepper1.avanti = True&lt;br /&gt;
 			stepper2.avanti = True&lt;br /&gt;
 		elif direction == &amp;quot;fd&amp;quot;:&lt;br /&gt;
 			stepper1.avanti = False&lt;br /&gt;
 			stepper2.avanti = False&lt;br /&gt;
 		elif direction == &amp;quot;lt&amp;quot;:&lt;br /&gt;
 			stepper1.avanti = True&lt;br /&gt;
 			stepper2.avanti = False&lt;br /&gt;
 		elif direction == &amp;quot;rt&amp;quot;:&lt;br /&gt;
 			stepper1.avanti = False&lt;br /&gt;
 			stepper2.avanti = True&lt;br /&gt;
 		elif direction == &amp;quot;pu&amp;quot;:&lt;br /&gt;
 			call([&amp;quot;echo 0=90 &amp;gt; /dev/servoblaster&amp;quot;],shell=True)&lt;br /&gt;
 			duration = 0&lt;br /&gt;
 		elif direction == &amp;quot;pd&amp;quot;:&lt;br /&gt;
 			call([&amp;quot;echo 0=160 &amp;gt; /dev/servoblaster&amp;quot;],shell=True)&lt;br /&gt;
 			duration = 0&lt;br /&gt;
 		speed = 1.0/denominator&lt;br /&gt;
 		time.sleep (0.5)&lt;br /&gt;
 		stepper1.ix = 0&lt;br /&gt;
 		stepper2.ix = 0&lt;br /&gt;
 		stepper1.px = 0&lt;br /&gt;
 		stepper2.px = 0&lt;br /&gt;
 		stepper1.go = True&lt;br /&gt;
 		stepper2.go = True&lt;br /&gt;
 		time.sleep(duration)&lt;br /&gt;
 		stepper1.go = False&lt;br /&gt;
 		stepper2.go = False&lt;br /&gt;
 	else:&lt;br /&gt;
 		print &amp;quot;exit&amp;quot;&lt;br /&gt;
 		call([&amp;quot;sudo killall servod&amp;quot;],shell=True)&lt;br /&gt;
 		stepper1.started = False&lt;br /&gt;
 		stepper2.started = False&lt;br /&gt;
= Il video =&lt;br /&gt;
[http://www.youtube.com/watch?v=IlGY5-Tbwzs&amp;amp;feature=youtu.be|Funzionamento base della Raspiruga]&lt;/div&gt;</summary>
		<author><name>Oloturia</name></author>
	</entry>
</feed>