<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="it">
	<id>https://www.raspibo.org/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=SoncioZ</id>
	<title>raspibo - Contributi utente [it]</title>
	<link rel="self" type="application/atom+xml" href="https://www.raspibo.org/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=SoncioZ"/>
	<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php/Speciale:Contributi/SoncioZ"/>
	<updated>2026-04-16T23:39:07Z</updated>
	<subtitle>Contributi utente</subtitle>
	<generator>MediaWiki 1.35.5</generator>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=LoM_project_-_Simple_Robot_Arm_Controller&amp;diff=7216</id>
		<title>LoM project - Simple Robot Arm Controller</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=LoM_project_-_Simple_Robot_Arm_Controller&amp;diff=7216"/>
		<updated>2019-11-21T10:18:40Z</updated>

		<summary type="html">&lt;p&gt;SoncioZ: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Simple Robot Arm Controller ==&lt;br /&gt;
Il programma in esempio permette di controllare un braccio robotico utilizzando tre potenziometri, uno per ogni giuntura del braccio escluso il polso, e un button switch per l'apertura e chiusura della pinza. Il programma non ha nulla di particolarmente complesso ma è un ottimo esempio per iniziare a capire il funzionamento del braccio e come programmarlo. L'unico accorgimento particolare è stato l'utilizzo di una funzione per fare una media degli angoli tra 2 iterazioni successive, questo stabilizza i dati e permette al braccio di essere più preciso nei movimenti.&lt;br /&gt;
&lt;br /&gt;
== Compineti ==&lt;br /&gt;
In questo esempio sono stati utilizzati i seguenti componenti:&lt;br /&gt;
&lt;br /&gt;
[[File:ListaCOmponentiBraccio.png| 600px |Image: 600 pixels]]&lt;br /&gt;
* Braccio,&lt;br /&gt;
* Shield di controllo,&lt;br /&gt;
* Arduino/Fishino,&lt;br /&gt;
* 1 Alimentatore da 12V 1A,&lt;br /&gt;
* 3 Potenziometri da 10Kohm,&lt;br /&gt;
* 1 Breadbord,&lt;br /&gt;
* 1 Push button switch,&lt;br /&gt;
* Qualche jumper e connettori.&lt;br /&gt;
&lt;br /&gt;
== Schema ==&lt;br /&gt;
Di seguito in figura è illustrato lo schema completo.&lt;br /&gt;
&lt;br /&gt;
[[File:SchemaDemo.png| 800px |Image: 800 pixels]]&lt;br /&gt;
&lt;br /&gt;
== Software == &lt;br /&gt;
Di seguito si riporta il codice con il codice implementato.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
MIT License&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2019 Filippo Soncini, Davide Allevi&lt;br /&gt;
&lt;br /&gt;
Permission is hereby granted, free of charge, to any person obtaining a copy&lt;br /&gt;
of this software and associated documentation files (the &amp;quot;Software&amp;quot;), to deal&lt;br /&gt;
in the Software without restriction, including without limitation the rights&lt;br /&gt;
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell&lt;br /&gt;
copies of the Software, and to permit persons to whom the Software is&lt;br /&gt;
furnished to do so, subject to the following conditions:&lt;br /&gt;
&lt;br /&gt;
The above copyright notice and this permission notice shall be included in all&lt;br /&gt;
copies or substantial portions of the Software.&lt;br /&gt;
&lt;br /&gt;
THE SOFTWARE IS PROVIDED &amp;quot;AS IS&amp;quot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR&lt;br /&gt;
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,&lt;br /&gt;
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE&lt;br /&gt;
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER&lt;br /&gt;
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,&lt;br /&gt;
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE&lt;br /&gt;
SOFTWARE.&lt;br /&gt;
&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;Servo.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Crea oggetti servo, uno per ogni servo del braccio.&lt;br /&gt;
Servo base;&lt;br /&gt;
Servo shoulder;&lt;br /&gt;
Servo elbow;&lt;br /&gt;
Servo gripper;&lt;br /&gt;
&lt;br /&gt;
// Assegno i pin dell'arduino&lt;br /&gt;
int pin = A0;&lt;br /&gt;
int pinS = A1;&lt;br /&gt;
int pinE = A2;&lt;br /&gt;
&lt;br /&gt;
const int buttonPin = A5; &lt;br /&gt;
&lt;br /&gt;
// Inizializzo le variabili angolo di ogni servo.&lt;br /&gt;
int firstangleB = 0;&lt;br /&gt;
int firstangleS = 0;&lt;br /&gt;
int firstangleE = 0;&lt;br /&gt;
&lt;br /&gt;
// Funzione di inizializzazione dei servo.&lt;br /&gt;
void initservo(){&lt;br /&gt;
  base.attach(11);      // collega il servo sul pin 11 all'oggetto base,&lt;br /&gt;
  shoulder.attach(10);  // collega il servo sul pin 10 all'oggetto shoulder,&lt;br /&gt;
  elbow.attach(9);      // collega il servo sul pin 9 all'oggetto elbow,&lt;br /&gt;
  gripper.attach(3);    // collega il servo sul pin 3 all'oggetto gripper.&lt;br /&gt;
&lt;br /&gt;
  // imposto l'angoli iniziali per ogni servo.&lt;br /&gt;
  base.write(90);       &lt;br /&gt;
  shoulder.write(90);&lt;br /&gt;
  elbow.write(110);&lt;br /&gt;
  gripper.write(100);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Funzione che ottiene il valorede del potenziometro scalato.&lt;br /&gt;
/* Parametri:&lt;br /&gt;
 *  int: pin          Pin dell'arduino&lt;br /&gt;
 *  &lt;br /&gt;
 *  Return:&lt;br /&gt;
 *  int: first        Angolo iniziale del servo collegato al pin&lt;br /&gt;
 */&lt;br /&gt;
int initangle(int pin){&lt;br /&gt;
  int angle = analogRead (pin);                // Legge il valore del potenziometro (valore compreso tra 0 e 1023)&lt;br /&gt;
  int first = map(angle, 0, 1023, 0, 180);     // Ridimensiono il valore per poterlo utilizzare sul servo (valore tra 0 e 180)&lt;br /&gt;
  return first;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Funzione che calcola la media del valore del potenziometro della precedente iterazione con il valore attuale del potenziometro.&lt;br /&gt;
/* Parametri:&lt;br /&gt;
 *  int: pin              Pin dell'arduino.&lt;br /&gt;
 *  int: firstangle       Valore del potenziometro dell'iterazione precedente.&lt;br /&gt;
 *  &lt;br /&gt;
 *  Return:&lt;br /&gt;
 *  int: firstangle       Ritorna la media arrotondata.&lt;br /&gt;
 */&lt;br /&gt;
int anglewrite(int pin, int firstangle){&lt;br /&gt;
  int angle = analogRead (pin);                 // Legge il valore del potenziometro (valore compreso tra 0 e 1023)&lt;br /&gt;
  int mapping = map(angle, 0, 1023, 0, 180);    // Ridimensiono il valore per poterlo utilizzare sul servo (valore tra 0 e 180)&lt;br /&gt;
  firstangle = (mapping + firstangle) / 2;      // Calcomo la media&lt;br /&gt;
  return firstangle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
   &lt;br /&gt;
  pinMode(buttonPin, OUTPUT);       // inizializza il pin del pulsante come input&lt;br /&gt;
  digitalWrite(buttonPin, HIGH);   // inizializza il valore del pulsante&lt;br /&gt;
&lt;br /&gt;
  // Chiamo la funzione per inizializzare.&lt;br /&gt;
  initservo();&lt;br /&gt;
  firstangleB = initangle(pin);&lt;br /&gt;
  firstangleS = initangle(pinS);&lt;br /&gt;
  firstangleE  = initangle(pinE);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
  // Calcolo e aggiorno la media dei valori dei potenziometri,&lt;br /&gt;
  // e imposta la posizione del servo in base al valore,&lt;br /&gt;
  // Questo per ogni servo.  &lt;br /&gt;
  firstangleB = anglewrite(pin, firstangleB);&lt;br /&gt;
  base.write(firstangleB);&lt;br /&gt;
  firstangleS = anglewrite(pinS, firstangleS);&lt;br /&gt;
  shoulder.write(firstangleS);&lt;br /&gt;
  firstangleE = anglewrite(pinE, firstangleE);&lt;br /&gt;
  elbow.write(firstangleE);&lt;br /&gt;
 &lt;br /&gt;
  // controlla se il pulsante viene premuto.&lt;br /&gt;
  if (digitalRead(buttonPin) == LOW) {&lt;br /&gt;
    gripper.write(140);                   // Se il pulsante viene premuto la il servo si porta ad un angolo di 140 (Chiusa)&lt;br /&gt;
  } else {&lt;br /&gt;
    gripper.write(90);                    // Altrimenti porta ad un angolo di 90 (Aperta)&lt;br /&gt;
  }  &lt;br /&gt;
  &lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
Una relazione più completa con guida utente sull'utilizzo del braccio [[File:Relazione_Laboratorio_di_making.pdf]]&lt;br /&gt;
&lt;br /&gt;
Specifiche della scheda di controllo [[File:SchedaControllo.pdf]]&lt;/div&gt;</summary>
		<author><name>SoncioZ</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=File:ListaCOmponentiBraccio.png&amp;diff=7215</id>
		<title>File:ListaCOmponentiBraccio.png</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=File:ListaCOmponentiBraccio.png&amp;diff=7215"/>
		<updated>2019-11-21T10:13:35Z</updated>

		<summary type="html">&lt;p&gt;SoncioZ: Lista componenti&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Lista componenti&lt;/div&gt;</summary>
		<author><name>SoncioZ</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=LoM_project_-_Simple_Robot_Arm_Controller&amp;diff=7214</id>
		<title>LoM project - Simple Robot Arm Controller</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=LoM_project_-_Simple_Robot_Arm_Controller&amp;diff=7214"/>
		<updated>2019-11-21T10:11:20Z</updated>

		<summary type="html">&lt;p&gt;SoncioZ: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Simple Robot Arm Controller ==&lt;br /&gt;
Il programma in esempio permette di controllare un braccio robotico utilizzando tre potenziometri, uno per ogni giuntura del braccio escluso il polso, e un button switch per l'apertura e chiusura della pinza. Il programma non ha nulla di particolarmente complesso ma è un ottimo esempio per iniziare a capire il funzionamento del braccio e come programmarlo. L'unico accorgimento particolare è stato l'utilizzo di una funzione per fare una media degli angoli tra 2 iterazioni successive, questo stabilizza i dati e permette al braccio di essere più preciso nei movimenti.&lt;br /&gt;
&lt;br /&gt;
== Compineti ==&lt;br /&gt;
In questo esempio sono stati utilizzati i seguenti componenti:&lt;br /&gt;
* Braccio,&lt;br /&gt;
* Shield di controllo,&lt;br /&gt;
* Arduino/Fishino,&lt;br /&gt;
* 1 Alimentatore da 12V 1A,&lt;br /&gt;
* 3 Potenziometri da 10Kohm,&lt;br /&gt;
* 1 Breadbord,&lt;br /&gt;
* 1 Push button switch,&lt;br /&gt;
* Qualche jumper e connettori.&lt;br /&gt;
&lt;br /&gt;
== Schema ==&lt;br /&gt;
Di seguito in figura è illustrato lo schema completo.&lt;br /&gt;
&lt;br /&gt;
[[File:SchemaDemo.png| 800px |Image: 800 pixels]]&lt;br /&gt;
&lt;br /&gt;
== Software == &lt;br /&gt;
Di seguito si riporta il codice con il codice implementato.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = &amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
MIT License&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2019 Filippo Soncini, Davide Allevi&lt;br /&gt;
&lt;br /&gt;
Permission is hereby granted, free of charge, to any person obtaining a copy&lt;br /&gt;
of this software and associated documentation files (the &amp;quot;Software&amp;quot;), to deal&lt;br /&gt;
in the Software without restriction, including without limitation the rights&lt;br /&gt;
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell&lt;br /&gt;
copies of the Software, and to permit persons to whom the Software is&lt;br /&gt;
furnished to do so, subject to the following conditions:&lt;br /&gt;
&lt;br /&gt;
The above copyright notice and this permission notice shall be included in all&lt;br /&gt;
copies or substantial portions of the Software.&lt;br /&gt;
&lt;br /&gt;
THE SOFTWARE IS PROVIDED &amp;quot;AS IS&amp;quot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR&lt;br /&gt;
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,&lt;br /&gt;
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE&lt;br /&gt;
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER&lt;br /&gt;
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,&lt;br /&gt;
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE&lt;br /&gt;
SOFTWARE.&lt;br /&gt;
&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;Servo.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Crea oggetti servo, uno per ogni servo del braccio.&lt;br /&gt;
Servo base;&lt;br /&gt;
Servo shoulder;&lt;br /&gt;
Servo elbow;&lt;br /&gt;
Servo gripper;&lt;br /&gt;
&lt;br /&gt;
// Assegno i pin dell'arduino&lt;br /&gt;
int pin = A0;&lt;br /&gt;
int pinS = A1;&lt;br /&gt;
int pinE = A2;&lt;br /&gt;
&lt;br /&gt;
const int buttonPin = A5; &lt;br /&gt;
&lt;br /&gt;
// Inizializzo le variabili angolo di ogni servo.&lt;br /&gt;
int firstangleB = 0;&lt;br /&gt;
int firstangleS = 0;&lt;br /&gt;
int firstangleE = 0;&lt;br /&gt;
&lt;br /&gt;
// Funzione di inizializzazione dei servo.&lt;br /&gt;
void initservo(){&lt;br /&gt;
  base.attach(11);      // collega il servo sul pin 11 all'oggetto base,&lt;br /&gt;
  shoulder.attach(10);  // collega il servo sul pin 10 all'oggetto shoulder,&lt;br /&gt;
  elbow.attach(9);      // collega il servo sul pin 9 all'oggetto elbow,&lt;br /&gt;
  gripper.attach(3);    // collega il servo sul pin 3 all'oggetto gripper.&lt;br /&gt;
&lt;br /&gt;
  // imposto l'angoli iniziali per ogni servo.&lt;br /&gt;
  base.write(90);       &lt;br /&gt;
  shoulder.write(90);&lt;br /&gt;
  elbow.write(110);&lt;br /&gt;
  gripper.write(100);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Funzione che ottiene il valorede del potenziometro scalato.&lt;br /&gt;
/* Parametri:&lt;br /&gt;
 *  int: pin          Pin dell'arduino&lt;br /&gt;
 *  &lt;br /&gt;
 *  Return:&lt;br /&gt;
 *  int: first        Angolo iniziale del servo collegato al pin&lt;br /&gt;
 */&lt;br /&gt;
int initangle(int pin){&lt;br /&gt;
  int angle = analogRead (pin);                // Legge il valore del potenziometro (valore compreso tra 0 e 1023)&lt;br /&gt;
  int first = map(angle, 0, 1023, 0, 180);     // Ridimensiono il valore per poterlo utilizzare sul servo (valore tra 0 e 180)&lt;br /&gt;
  return first;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Funzione che calcola la media del valore del potenziometro della precedente iterazione con il valore attuale del potenziometro.&lt;br /&gt;
/* Parametri:&lt;br /&gt;
 *  int: pin              Pin dell'arduino.&lt;br /&gt;
 *  int: firstangle       Valore del potenziometro dell'iterazione precedente.&lt;br /&gt;
 *  &lt;br /&gt;
 *  Return:&lt;br /&gt;
 *  int: firstangle       Ritorna la media arrotondata.&lt;br /&gt;
 */&lt;br /&gt;
int anglewrite(int pin, int firstangle){&lt;br /&gt;
  int angle = analogRead (pin);                 // Legge il valore del potenziometro (valore compreso tra 0 e 1023)&lt;br /&gt;
  int mapping = map(angle, 0, 1023, 0, 180);    // Ridimensiono il valore per poterlo utilizzare sul servo (valore tra 0 e 180)&lt;br /&gt;
  firstangle = (mapping + firstangle) / 2;      // Calcomo la media&lt;br /&gt;
  return firstangle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
   &lt;br /&gt;
  pinMode(buttonPin, OUTPUT);       // inizializza il pin del pulsante come input&lt;br /&gt;
  digitalWrite(buttonPin, HIGH);   // inizializza il valore del pulsante&lt;br /&gt;
&lt;br /&gt;
  // Chiamo la funzione per inizializzare.&lt;br /&gt;
  initservo();&lt;br /&gt;
  firstangleB = initangle(pin);&lt;br /&gt;
  firstangleS = initangle(pinS);&lt;br /&gt;
  firstangleE  = initangle(pinE);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
  // Calcolo e aggiorno la media dei valori dei potenziometri,&lt;br /&gt;
  // e imposta la posizione del servo in base al valore,&lt;br /&gt;
  // Questo per ogni servo.  &lt;br /&gt;
  firstangleB = anglewrite(pin, firstangleB);&lt;br /&gt;
  base.write(firstangleB);&lt;br /&gt;
  firstangleS = anglewrite(pinS, firstangleS);&lt;br /&gt;
  shoulder.write(firstangleS);&lt;br /&gt;
  firstangleE = anglewrite(pinE, firstangleE);&lt;br /&gt;
  elbow.write(firstangleE);&lt;br /&gt;
 &lt;br /&gt;
  // controlla se il pulsante viene premuto.&lt;br /&gt;
  if (digitalRead(buttonPin) == LOW) {&lt;br /&gt;
    gripper.write(140);                   // Se il pulsante viene premuto la il servo si porta ad un angolo di 140 (Chiusa)&lt;br /&gt;
  } else {&lt;br /&gt;
    gripper.write(90);                    // Altrimenti porta ad un angolo di 90 (Aperta)&lt;br /&gt;
  }  &lt;br /&gt;
  &lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
Una relazione più completa con guida utente sull'utilizzo del braccio [[File:Relazione_Laboratorio_di_making.pdf]]&lt;br /&gt;
&lt;br /&gt;
Specifiche della scheda di controllo [[File:SchedaControllo.pdf]]&lt;/div&gt;</summary>
		<author><name>SoncioZ</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=File:SchedaControllo.pdf&amp;diff=7213</id>
		<title>File:SchedaControllo.pdf</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=File:SchedaControllo.pdf&amp;diff=7213"/>
		<updated>2019-11-21T10:09:23Z</updated>

		<summary type="html">&lt;p&gt;SoncioZ: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>SoncioZ</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=File:Relazione_Laboratorio_di_making.pdf&amp;diff=7212</id>
		<title>File:Relazione Laboratorio di making.pdf</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=File:Relazione_Laboratorio_di_making.pdf&amp;diff=7212"/>
		<updated>2019-11-21T10:06:53Z</updated>

		<summary type="html">&lt;p&gt;SoncioZ: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>SoncioZ</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=LoM_project_-_Simple_Robot_Arm_Controller&amp;diff=7211</id>
		<title>LoM project - Simple Robot Arm Controller</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=LoM_project_-_Simple_Robot_Arm_Controller&amp;diff=7211"/>
		<updated>2019-11-21T09:54:15Z</updated>

		<summary type="html">&lt;p&gt;SoncioZ: wiki Simple Robot Arm Controller&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Simple Robot Arm Controller ==&lt;br /&gt;
Il programma in esempio permette di controllare un braccio robotico utilizzando tre potenziometri, uno per ogni giuntura del braccio escluso il polso, e un button switch per l'apertura e chiusura della pinza. Il programma non ha nulla di particolarmente complesso ma è un ottimo esempio per iniziare a capire il funzionamento del braccio e come programmarlo. L'unico accorgimento particolare è stato l'utilizzo di una funzione per fare una media degli angoli tra 2 iterazioni successive, questo stabilizza i dati e permette al braccio di essere più preciso nei movimenti.&lt;br /&gt;
&lt;br /&gt;
== Compineti ==&lt;br /&gt;
In questo esempio sono stati utilizzati i seguenti componenti:&lt;br /&gt;
* Braccio,&lt;br /&gt;
* Shield di controllo,&lt;br /&gt;
* Arduino/Fishino,&lt;br /&gt;
* 1 Alimentatore da 12V 1A,&lt;br /&gt;
* 3 Potenziometri da 10Kohm,&lt;br /&gt;
* 1 Breadbord,&lt;br /&gt;
* 1 Push button switch,&lt;br /&gt;
* Qualche jumper e connettori.&lt;br /&gt;
&lt;br /&gt;
== Schema ==&lt;br /&gt;
Di seguito in figura è illustrato lo schema completo.&lt;br /&gt;
&lt;br /&gt;
[[File:SchemaDemo.png| 800px |Image: 800 pixels]]&lt;br /&gt;
&lt;br /&gt;
== Software == &lt;br /&gt;
Di seguito si riporta il codice con il codice implementato.&lt;br /&gt;
&amp;lt;source lang = C++&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
MIT License&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2019 Filippo Soncini, Davide Allevi&lt;br /&gt;
&lt;br /&gt;
Permission is hereby granted, free of charge, to any person obtaining a copy&lt;br /&gt;
of this software and associated documentation files (the &amp;quot;Software&amp;quot;), to deal&lt;br /&gt;
in the Software without restriction, including without limitation the rights&lt;br /&gt;
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell&lt;br /&gt;
copies of the Software, and to permit persons to whom the Software is&lt;br /&gt;
furnished to do so, subject to the following conditions:&lt;br /&gt;
&lt;br /&gt;
The above copyright notice and this permission notice shall be included in all&lt;br /&gt;
copies or substantial portions of the Software.&lt;br /&gt;
&lt;br /&gt;
THE SOFTWARE IS PROVIDED &amp;quot;AS IS&amp;quot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR&lt;br /&gt;
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,&lt;br /&gt;
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE&lt;br /&gt;
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER&lt;br /&gt;
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,&lt;br /&gt;
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE&lt;br /&gt;
SOFTWARE.&lt;br /&gt;
&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;Servo.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Crea oggetti servo, uno per ogni servo del braccio.&lt;br /&gt;
Servo base;&lt;br /&gt;
Servo shoulder;&lt;br /&gt;
Servo elbow;&lt;br /&gt;
Servo gripper;&lt;br /&gt;
&lt;br /&gt;
// Assegno i pin dell'arduino&lt;br /&gt;
int pin = A0;&lt;br /&gt;
int pinS = A1;&lt;br /&gt;
int pinE = A2;&lt;br /&gt;
&lt;br /&gt;
const int buttonPin = A5; &lt;br /&gt;
&lt;br /&gt;
// Inizializzo le variabili angolo di ogni servo.&lt;br /&gt;
int firstangleB = 0;&lt;br /&gt;
int firstangleS = 0;&lt;br /&gt;
int firstangleE = 0;&lt;br /&gt;
&lt;br /&gt;
// Funzione di inizializzazione dei servo.&lt;br /&gt;
void initservo(){&lt;br /&gt;
  base.attach(11);      // collega il servo sul pin 11 all'oggetto base,&lt;br /&gt;
  shoulder.attach(10);  // collega il servo sul pin 10 all'oggetto shoulder,&lt;br /&gt;
  elbow.attach(9);      // collega il servo sul pin 9 all'oggetto elbow,&lt;br /&gt;
  gripper.attach(3);    // collega il servo sul pin 3 all'oggetto gripper.&lt;br /&gt;
&lt;br /&gt;
  // imposto l'angoli iniziali per ogni servo.&lt;br /&gt;
  base.write(90);       &lt;br /&gt;
  shoulder.write(90);&lt;br /&gt;
  elbow.write(110);&lt;br /&gt;
  gripper.write(100);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Funzione che ottiene il valorede del potenziometro scalato.&lt;br /&gt;
/* Parametri:&lt;br /&gt;
 *  int: pin          Pin dell'arduino&lt;br /&gt;
 *  &lt;br /&gt;
 *  Return:&lt;br /&gt;
 *  int: first        Angolo iniziale del servo collegato al pin&lt;br /&gt;
 */&lt;br /&gt;
int initangle(int pin){&lt;br /&gt;
  int angle = analogRead (pin);                // Legge il valore del potenziometro (valore compreso tra 0 e 1023)&lt;br /&gt;
  int first = map(angle, 0, 1023, 0, 180);     // Ridimensiono il valore per poterlo utilizzare sul servo (valore tra 0 e 180)&lt;br /&gt;
  return first;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Funzione che calcola la media del valore del potenziometro della precedente iterazione con il valore attuale del potenziometro.&lt;br /&gt;
/* Parametri:&lt;br /&gt;
 *  int: pin              Pin dell'arduino.&lt;br /&gt;
 *  int: firstangle       Valore del potenziometro dell'iterazione precedente.&lt;br /&gt;
 *  &lt;br /&gt;
 *  Return:&lt;br /&gt;
 *  int: firstangle       Ritorna la media arrotondata.&lt;br /&gt;
 */&lt;br /&gt;
int anglewrite(int pin, int firstangle){&lt;br /&gt;
  int angle = analogRead (pin);                 // Legge il valore del potenziometro (valore compreso tra 0 e 1023)&lt;br /&gt;
  int mapping = map(angle, 0, 1023, 0, 180);    // Ridimensiono il valore per poterlo utilizzare sul servo (valore tra 0 e 180)&lt;br /&gt;
  firstangle = (mapping + firstangle) / 2;      // Calcomo la media&lt;br /&gt;
  return firstangle;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
   &lt;br /&gt;
  pinMode(buttonPin, OUTPUT);       // inizializza il pin del pulsante come input&lt;br /&gt;
  digitalWrite(buttonPin, HIGH);   // inizializza il valore del pulsante&lt;br /&gt;
&lt;br /&gt;
  // Chiamo la funzione per inizializzare.&lt;br /&gt;
  initservo();&lt;br /&gt;
  firstangleB = initangle(pin);&lt;br /&gt;
  firstangleS = initangle(pinS);&lt;br /&gt;
  firstangleE  = initangle(pinE);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
&lt;br /&gt;
  // Calcolo e aggiorno la media dei valori dei potenziometri,&lt;br /&gt;
  // e imposta la posizione del servo in base al valore,&lt;br /&gt;
  // Questo per ogni servo.  &lt;br /&gt;
  firstangleB = anglewrite(pin, firstangleB);&lt;br /&gt;
  base.write(firstangleB);&lt;br /&gt;
  firstangleS = anglewrite(pinS, firstangleS);&lt;br /&gt;
  shoulder.write(firstangleS);&lt;br /&gt;
  firstangleE = anglewrite(pinE, firstangleE);&lt;br /&gt;
  elbow.write(firstangleE);&lt;br /&gt;
 &lt;br /&gt;
  // controlla se il pulsante viene premuto.&lt;br /&gt;
  if (digitalRead(buttonPin) == LOW) {&lt;br /&gt;
    gripper.write(140);                   // Se il pulsante viene premuto la il servo si porta ad un angolo di 140 (Chiusa)&lt;br /&gt;
  } else {&lt;br /&gt;
    gripper.write(90);                    // Altrimenti porta ad un angolo di 90 (Aperta)&lt;br /&gt;
  }  &lt;br /&gt;
  &lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>SoncioZ</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=File:SchemaDemo.png&amp;diff=7210</id>
		<title>File:SchemaDemo.png</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=File:SchemaDemo.png&amp;diff=7210"/>
		<updated>2019-11-21T09:46:32Z</updated>

		<summary type="html">&lt;p&gt;SoncioZ: Schema progetto Simple Robot Arm Controller&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Schema progetto Simple Robot Arm Controller&lt;/div&gt;</summary>
		<author><name>SoncioZ</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=Laboratory_of_Making&amp;diff=7209</id>
		<title>Laboratory of Making</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=Laboratory_of_Making&amp;diff=7209"/>
		<updated>2019-11-21T09:29:41Z</updated>

		<summary type="html">&lt;p&gt;SoncioZ: Aggiunta nuovo progetto &amp;quot;Simple Robot Arm Controller&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Laboratory of Making is an elective course for master students in Computer Science at the University of Bologna.&lt;br /&gt;
&lt;br /&gt;
[[LoM Lectures 2018/2019]]&lt;br /&gt;
&lt;br /&gt;
[[LoM Documents]]&lt;br /&gt;
&lt;br /&gt;
[[LoM Experiments]]&lt;br /&gt;
&lt;br /&gt;
[[LoM project ideas]]&lt;br /&gt;
&lt;br /&gt;
[[LoM lecture notes]]&lt;br /&gt;
&lt;br /&gt;
[[LoM exercises]]&lt;br /&gt;
&lt;br /&gt;
[[LoM project - Smart Recycle Bin]]&lt;br /&gt;
&lt;br /&gt;
[[LoM project - Simple Robot Arm Controller]]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
[[LoM old stuff]]&lt;/div&gt;</summary>
		<author><name>SoncioZ</name></author>
	</entry>
</feed>