<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
	<id>https://wikigeii.iut-troyes.univ-reims.fr/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Balancing</id>
	<title>troyesGEII - Contributions [fr]</title>
	<link rel="self" type="application/atom+xml" href="https://wikigeii.iut-troyes.univ-reims.fr/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Balancing"/>
	<link rel="alternate" type="text/html" href="https://wikigeii.iut-troyes.univ-reims.fr/index.php?title=Sp%C3%A9cial:Contributions/Balancing"/>
	<updated>2026-09-20T13:36:07Z</updated>
	<subtitle>Contributions</subtitle>
	<generator>MediaWiki 1.46.0</generator>
	<entry>
		<id>https://wikigeii.iut-troyes.univ-reims.fr/index.php?title=Balancingbot&amp;diff=9549</id>
		<title>Balancingbot</title>
		<link rel="alternate" type="text/html" href="https://wikigeii.iut-troyes.univ-reims.fr/index.php?title=Balancingbot&amp;diff=9549"/>
		<updated>2017-04-05T21:28:41Z</updated>

		<summary type="html">&lt;p&gt;Balancing : /* {{Vert|Tentative d&amp;#039;équilibre sans troisième roue}} */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;={{Rouge|Projet 2016/2017 : Villette - Vin}}=&lt;br /&gt;
&lt;br /&gt;
=={{Vert|Tentative d&#039;équilibre sans troisième roue}}==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:L298N_Shield.jpg|vignette|L298N Shield]]&lt;br /&gt;
[[Fichier:L298P_Shield_V1dot2.jpg|vignette|L298P Shield V1.2]]&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, nous avons tenté de voir si l&#039;équilibre du robot était envisageable sans l&#039;emploi d&#039;une troisième roue. Plusieurs problèmes se sont alors posés : &lt;br /&gt;
&lt;br /&gt;
# La carte de puissance ne commandait qu&#039;un seul moteur&lt;br /&gt;
# Le code dans la télécommande et le robot ne fonctionnaient pas&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Correction de la carte de puissance}}===&lt;br /&gt;
&lt;br /&gt;
Afin de vérifier si la carte alimentait convenablement le deuxième moteur, nous avons utilisé un voltmètre. Lors de son utilisation, la carte a cessé d&#039;alimenter le deuxième moteur, nous obligeant à changer la carte [https://www.dfrobot.com/wiki/index.php/Arduino_Motor_Shield_(L298N)_(SKU:DRI0009) L298N Shield] pour une [https://www.dfrobot.com/index.php?route=product/product&amp;amp;product_id=69 L298P Shield V1.2].&lt;br /&gt;
&amp;lt;u&amp;gt;La nouvelle carte de puissance n&#039;alimente pas les cartes Arduino connectées à celle-ci. Il est donc nécessaire de tirer un câble de la batterie jusqu&#039;au Vin de l&#039;Arduino.&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Reprogrammation de la carte du robot}}===&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif ici est de programmer le robot de façon à vérifier si celui-ci est capable de tenir en équilibre ou non, et donc si l&#039;ajout d&#039;une troisième roue est nécessaire.&lt;br /&gt;
&lt;br /&gt;
{{Rouge|&amp;lt;b&amp;gt;Problème :&amp;lt;/b&amp;gt; Durant les tests du programme, une erreur de branchement (12V de la batterie connecté au 5V de l&#039;Arduino) a grillé un ATMEGA328P et l&#039;accéléromètre.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;&amp;lt;u&amp;gt;Code Robot&amp;lt;/u&amp;gt;&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#include &amp;quot;Wire.h&amp;quot;&lt;br /&gt;
#include &amp;quot;SPI.h&amp;quot;  &lt;br /&gt;
#include &amp;quot;Mirf.h&amp;quot;&lt;br /&gt;
#include &amp;quot;nRF24L01.h&amp;quot;&lt;br /&gt;
#include &amp;quot;MirfHardwareSpiDriver.h&amp;quot;&lt;br /&gt;
#include &amp;quot;I2Cdev.h&amp;quot;&lt;br /&gt;
#include &amp;quot;MPU6050.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
//Valeur limite de l&#039;accéléromètre&lt;br /&gt;
#define MAX_READ_ABS 16384&lt;br /&gt;
//Valeur limite des PWM (commande moteur)&lt;br /&gt;
#define MAX_WRITE_ABS 255&lt;br /&gt;
//Offset de l&#039;accéléromètre (valeur mesurée lorsque le robot est à l&#039;horizontal)&lt;br /&gt;
#define OFFSET -2000&lt;br /&gt;
&lt;br /&gt;
const double MAX_READ_NEG = (-MAX_READ_ABS+OFFSET/2.0); //Valeur maximale réelle négative (avec offset) =-17384&lt;br /&gt;
const double MAX_READ_POS = (MAX_READ_ABS+OFFSET/2.0); //Valeur maximale réelle positive (avec offset) =15384&lt;br /&gt;
&lt;br /&gt;
MPU6050 accelgyro;&lt;br /&gt;
int16_t ax, ay, az;&lt;br /&gt;
int16_t gx, gy, gz;&lt;br /&gt;
&lt;br /&gt;
long accelero;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  accelgyro.initialize();&lt;br /&gt;
  for(unsigned char i = 2 ; i &amp;lt;= 5 ; i++)&lt;br /&gt;
  {&lt;br /&gt;
    pinMode(i, OUTPUT);&lt;br /&gt;
  }&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
long getAccelero(long n = 100)&lt;br /&gt;
{&lt;br /&gt;
  long value = 0;&lt;br /&gt;
  for(long i = 0 ; i &amp;lt; n ; i++)&lt;br /&gt;
  {&lt;br /&gt;
    accelgyro.getMotion6(&amp;amp;ax, &amp;amp;ay, &amp;amp;az, &amp;amp;gx, &amp;amp;gy, &amp;amp;gz);&lt;br /&gt;
    value += ay;&lt;br /&gt;
  }  &lt;br /&gt;
  return value/n;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void arreter()&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(2, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void avancer(char n = 50)&lt;br /&gt;
{&lt;br /&gt;
  if(n == 0)&lt;br /&gt;
  {&lt;br /&gt;
    arreter();&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    analogWrite(3,(unsigned char)(MAX_WRITE_ABS - MAX_WRITE_ABS*(100-n)/200.0));&lt;br /&gt;
    analogWrite(5,(unsigned char)(MAX_WRITE_ABS - MAX_WRITE_ABS*(100-n)/200.0));&lt;br /&gt;
    digitalWrite(2,HIGH);&lt;br /&gt;
    digitalWrite(4,HIGH);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void reculer(char n = 50)&lt;br /&gt;
{&lt;br /&gt;
  if(n == 0)&lt;br /&gt;
  {&lt;br /&gt;
    arreter();&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    analogWrite(3,(unsigned char)(MAX_WRITE_ABS*(100-n)/200.0));&lt;br /&gt;
    analogWrite(5,(unsigned char)(MAX_WRITE_ABS*(100-n)/200.0));&lt;br /&gt;
    digitalWrite(2,HIGH);&lt;br /&gt;
    digitalWrite(4,HIGH);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void tourner(char n = 0)&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  bool _stop = 0;&lt;br /&gt;
  &lt;br /&gt;
  accelero = getAccelero(1);&lt;br /&gt;
  Serial.println(accelero);&lt;br /&gt;
  if(_stop)&lt;br /&gt;
  {&lt;br /&gt;
    if(accelero &amp;gt; 0.9*MAX_READ_POS || accelero &amp;lt; 0.9*MAX_READ_NEG)&lt;br /&gt;
    {&lt;br /&gt;
      arreter();&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
      if(accelero &amp;lt; OFFSET)&lt;br /&gt;
      {&lt;br /&gt;
        reculer(accelero/(0.9*MAX_READ_NEG)*100);&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        avancer(accelero/(0.9*MAX_READ_POS)*100);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    arreter();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#A000E0&amp;quot;&amp;gt;Limites&amp;lt;/span&amp;gt;====&lt;br /&gt;
* Les tests ont révélé une incompatibilité réactivité/pertinence. L&#039;accéléromètre donnant souvent des valeurs incohérentes, il était nécessaire d&#039;échantillonner ces valeurs. Plus l&#039;échantillon est important et moins le robot était réactif. Mais moins l&#039;échantillon est important, moins le robot se retrouve capable de réagir correctement (il accélère parfois dans le mauvais sens à cause d&#039;une valeur d&#039;accéléromètre erronée).&lt;br /&gt;
* Les moteurs ne réagissent pas assez rapidement à une commande, rendant l&#039;équilibre quasi-impossible.&lt;br /&gt;
&lt;br /&gt;
=={{Vert|Ajout d&#039;une troisième roue}}==&lt;br /&gt;
[[Fichier:Roue_folle.jpg|vignette|Roue folle]]&lt;br /&gt;
&lt;br /&gt;
L&#039;équilibre étant infaisable, nous avons donc ajouté une troisième roue dite &amp;quot;folle&amp;quot;.&lt;br /&gt;
Le côté qui nous a posé le plus de problèmes ici est la programmation du robot. En effet, après avoir « finit » celle-ci, nous avons remarqué que le comportement du robot était aléatoire et instable. Après le test des moteurs, nous en avons conclus que {{Rouge|&amp;lt;u&amp;gt;la documentation sur la carte de puissance est erronée, rendant le programme réalisé faux.&amp;lt;/u&amp;gt;}} Les corrections suivantes sont apportées :&lt;br /&gt;
* Le sens des moteurs est donné par les pins M1 et M2 ;&lt;br /&gt;
* La vitesse des moteurs est commandée en PWM 8bits par les pins E1 et E2 ;&lt;br /&gt;
Cette deuxième modification de la documentation apporte un nouveau problème : les pins E1 et E2 sont physiquement reliées aux pattes 5 et 6 qui ne sont pas des PWM. Nous les avons donc reliées aux pattes 9 pour la 5 et 10 pour la 6. Le programme s&#039;en retrouve très simplifié.&lt;br /&gt;
&lt;br /&gt;
[http://www.iut-troyes.univ-reims.fr/wikigeii/images/e/e8/Remote.zip &amp;lt;u&amp;gt;Code de la télécommande&amp;lt;/u&amp;gt;]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.iut-troyes.univ-reims.fr/wikigeii/images/5/5f/Robot.zip &amp;lt;u&amp;gt;Code du robot&amp;lt;/u&amp;gt;]&lt;/div&gt;</summary>
		<author><name>Balancing</name></author>
	</entry>
	<entry>
		<id>https://wikigeii.iut-troyes.univ-reims.fr/index.php?title=Balancingbot&amp;diff=8940</id>
		<title>Balancingbot</title>
		<link rel="alternate" type="text/html" href="https://wikigeii.iut-troyes.univ-reims.fr/index.php?title=Balancingbot&amp;diff=8940"/>
		<updated>2017-01-11T16:25:13Z</updated>

		<summary type="html">&lt;p&gt;Balancing : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;={{Rouge|Projet 2016/2017 : Villette - Vin}}=&lt;br /&gt;
&lt;br /&gt;
=={{Vert|Tentative d&#039;équilibre sans troisième roue}}==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:L298N_Shield.jpg|vignette|L298N Shield]]&lt;br /&gt;
[[Fichier:L298P_Shield_V1dot2.jpg|vignette|L298P Shield V1.2]]&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, nous avons tenté de voir si l&#039;équilibre du robot était envisageable sans l&#039;emploi d&#039;une troisième roue. Plusieurs problèmes se sont alors posés : &lt;br /&gt;
&lt;br /&gt;
# La carte de puissance ne commandait qu&#039;un seul moteur&lt;br /&gt;
&lt;br /&gt;
# Le code dans la télécommande et le robot ne fonctionnaient pas&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Correction de la carte de puissance}}===&lt;br /&gt;
&lt;br /&gt;
Afin de vérifier si la carte alimentait convenablement le deuxième moteur, nous avons utilisé un voltmètre. Lors de son utilisation, la carte a cessé d&#039;alimenter le deuxième moteur, nous obligeant à changer la carte [https://www.dfrobot.com/wiki/index.php/Arduino_Motor_Shield_(L298N)_(SKU:DRI0009) L298N Shield] pour une [https://www.dfrobot.com/index.php?route=product/product&amp;amp;product_id=69 L298P Shield V1.2].&lt;br /&gt;
&amp;lt;u&amp;gt;La nouvelle carte de puissance n&#039;alimente pas les cartes Arduino connectées à celle-ci. Il est donc nécessaire de tirer un câble de la batterie jusqu&#039;au Vin de l&#039;Arduino.&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Reprogrammation de la carte du robot}}===&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif ici est de programmer le robot de façon à vérifier si celui-ci est capable de tenir en équilibre ou non, et donc si l&#039;ajout d&#039;une troisième roue est nécessaire.&lt;br /&gt;
&lt;br /&gt;
{{Rouge|&amp;lt;b&amp;gt;Problème :&amp;lt;/b&amp;gt; Durant les tests du programme, une erreur de branchement (12V de la batterie connecté au 5V de l&#039;Arduino) a grillé un ATMEGA328P et l&#039;accéléromètre.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;&amp;lt;u&amp;gt;Code Robot&amp;lt;/u&amp;gt;&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#include &amp;quot;Wire.h&amp;quot;&lt;br /&gt;
#include &amp;quot;SPI.h&amp;quot;  &lt;br /&gt;
#include &amp;quot;Mirf.h&amp;quot;&lt;br /&gt;
#include &amp;quot;nRF24L01.h&amp;quot;&lt;br /&gt;
#include &amp;quot;MirfHardwareSpiDriver.h&amp;quot;&lt;br /&gt;
#include &amp;quot;I2Cdev.h&amp;quot;&lt;br /&gt;
#include &amp;quot;MPU6050.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
//Valeur limite de l&#039;accéléromètre&lt;br /&gt;
#define MAX_READ_ABS 16384&lt;br /&gt;
//Valeur limite des PWM (commande moteur)&lt;br /&gt;
#define MAX_WRITE_ABS 255&lt;br /&gt;
//Offset de l&#039;accéléromètre (valeur mesurée lorsque le robot est à l&#039;horizontal)&lt;br /&gt;
#define OFFSET -2000&lt;br /&gt;
&lt;br /&gt;
const double MAX_READ_NEG = (-MAX_READ_ABS+OFFSET/2.0); //Valeur maximale réelle négative (avec offset) =-17384&lt;br /&gt;
const double MAX_READ_POS = (MAX_READ_ABS+OFFSET/2.0); //Valeur maximale réelle positive (avec offset) =15384&lt;br /&gt;
&lt;br /&gt;
MPU6050 accelgyro;&lt;br /&gt;
int16_t ax, ay, az;&lt;br /&gt;
int16_t gx, gy, gz;&lt;br /&gt;
&lt;br /&gt;
long accelero;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  accelgyro.initialize();&lt;br /&gt;
  for(unsigned char i = 2 ; i &amp;lt;= 5 ; i++)&lt;br /&gt;
  {&lt;br /&gt;
    pinMode(i, OUTPUT);&lt;br /&gt;
  }&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
long getAccelero(long n = 100)&lt;br /&gt;
{&lt;br /&gt;
  long value = 0;&lt;br /&gt;
  for(long i = 0 ; i &amp;lt; n ; i++)&lt;br /&gt;
  {&lt;br /&gt;
    accelgyro.getMotion6(&amp;amp;ax, &amp;amp;ay, &amp;amp;az, &amp;amp;gx, &amp;amp;gy, &amp;amp;gz);&lt;br /&gt;
    value += ay;&lt;br /&gt;
  }  &lt;br /&gt;
  return value/n;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void arreter()&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(2, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void avancer(char n = 50)&lt;br /&gt;
{&lt;br /&gt;
  if(n == 0)&lt;br /&gt;
  {&lt;br /&gt;
    arreter();&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    analogWrite(3,(unsigned char)(MAX_WRITE_ABS - MAX_WRITE_ABS*(100-n)/200.0));&lt;br /&gt;
    analogWrite(5,(unsigned char)(MAX_WRITE_ABS - MAX_WRITE_ABS*(100-n)/200.0));&lt;br /&gt;
    digitalWrite(2,HIGH);&lt;br /&gt;
    digitalWrite(4,HIGH);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void reculer(char n = 50)&lt;br /&gt;
{&lt;br /&gt;
  if(n == 0)&lt;br /&gt;
  {&lt;br /&gt;
    arreter();&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    analogWrite(3,(unsigned char)(MAX_WRITE_ABS*(100-n)/200.0));&lt;br /&gt;
    analogWrite(5,(unsigned char)(MAX_WRITE_ABS*(100-n)/200.0));&lt;br /&gt;
    digitalWrite(2,HIGH);&lt;br /&gt;
    digitalWrite(4,HIGH);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void tourner(char n = 0)&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  bool _stop = 0;&lt;br /&gt;
  &lt;br /&gt;
  accelero = getAccelero(1);&lt;br /&gt;
  Serial.println(accelero);&lt;br /&gt;
  if(_stop)&lt;br /&gt;
  {&lt;br /&gt;
    if(accelero &amp;gt; 0.9*MAX_READ_POS || accelero &amp;lt; 0.9*MAX_READ_NEG)&lt;br /&gt;
    {&lt;br /&gt;
      arreter();&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
      if(accelero &amp;lt; OFFSET)&lt;br /&gt;
      {&lt;br /&gt;
        reculer(accelero/(0.9*MAX_READ_NEG)*100);&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        avancer(accelero/(0.9*MAX_READ_POS)*100);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    arreter();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#A000E0&amp;quot;&amp;gt;Limites&amp;lt;/span&amp;gt;====&lt;br /&gt;
* Les tests ont révélé une incompatibilité réactivité/pertinence. L&#039;accéléromètre donnant souvent des valeurs incohérentes, il était nécessaire d&#039;échantillonner ces valeurs. Plus l&#039;échantillon est important et moins le robot était réactif. Mais moins l&#039;échantillon est important, moins le robot se retrouve capable de réagir correctement (il accélère parfois dans le mauvais sens à cause d&#039;une valeur d&#039;accéléromètre erronée).&lt;br /&gt;
* Les moteurs ne réagissent pas assez rapidement à une commande, rendant l&#039;équilibre quasi-impossible.&lt;br /&gt;
&lt;br /&gt;
=={{Vert|Ajout d&#039;une troisième roue}}==&lt;br /&gt;
[[Fichier:Roue_folle.jpg|vignette|Roue folle]]&lt;br /&gt;
&lt;br /&gt;
L&#039;équilibre étant infaisable, nous avons donc ajouté une troisième roue dite &amp;quot;folle&amp;quot;.&lt;br /&gt;
Le côté qui nous a posé le plus de problèmes ici est la programmation du robot. En effet, après avoir « finit » celle-ci, nous avons remarqué que le comportement du robot était aléatoire et instable. Après le test des moteurs, nous en avons conclus que {{Rouge|&amp;lt;u&amp;gt;la documentation sur la carte de puissance est erronée, rendant le programme réalisé faux.&amp;lt;/u&amp;gt;}} Les corrections suivantes sont apportées :&lt;br /&gt;
* Le sens des moteurs est donné par les pins M1 et M2 ;&lt;br /&gt;
* La vitesse des moteurs est commandée en PWM 8bits par les pins E1 et E2 ;&lt;br /&gt;
Cette deuxième modification de la documentation apporte un nouveau problème : les pins E1 et E2 sont physiquement reliées aux pattes 5 et 6 qui ne sont pas des PWM. Nous les avons donc reliées aux pattes 9 pour la 5 et 10 pour la 6. Le programme s&#039;en retrouve très simplifié.&lt;br /&gt;
&lt;br /&gt;
[http://www.iut-troyes.univ-reims.fr/wikigeii/images/e/e8/Remote.zip &amp;lt;u&amp;gt;Code de la télécommande&amp;lt;/u&amp;gt;]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.iut-troyes.univ-reims.fr/wikigeii/images/5/5f/Robot.zip &amp;lt;u&amp;gt;Code du robot&amp;lt;/u&amp;gt;]&lt;/div&gt;</summary>
		<author><name>Balancing</name></author>
	</entry>
	<entry>
		<id>https://wikigeii.iut-troyes.univ-reims.fr/index.php?title=Fichier:Robot.zip&amp;diff=8937</id>
		<title>Fichier:Robot.zip</title>
		<link rel="alternate" type="text/html" href="https://wikigeii.iut-troyes.univ-reims.fr/index.php?title=Fichier:Robot.zip&amp;diff=8937"/>
		<updated>2017-01-11T16:19:43Z</updated>

		<summary type="html">&lt;p&gt;Balancing : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Balancing</name></author>
	</entry>
	<entry>
		<id>https://wikigeii.iut-troyes.univ-reims.fr/index.php?title=Fichier:Remote.zip&amp;diff=8936</id>
		<title>Fichier:Remote.zip</title>
		<link rel="alternate" type="text/html" href="https://wikigeii.iut-troyes.univ-reims.fr/index.php?title=Fichier:Remote.zip&amp;diff=8936"/>
		<updated>2017-01-11T16:19:06Z</updated>

		<summary type="html">&lt;p&gt;Balancing : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Balancing</name></author>
	</entry>
	<entry>
		<id>https://wikigeii.iut-troyes.univ-reims.fr/index.php?title=Balancingbot&amp;diff=8935</id>
		<title>Balancingbot</title>
		<link rel="alternate" type="text/html" href="https://wikigeii.iut-troyes.univ-reims.fr/index.php?title=Balancingbot&amp;diff=8935"/>
		<updated>2017-01-11T16:18:25Z</updated>

		<summary type="html">&lt;p&gt;Balancing : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;={{Rouge|Projet 2016/2017 : Villette - Vin}}=&lt;br /&gt;
&lt;br /&gt;
=={{Vert|Tentative d&#039;équilibre sans troisième roue}}==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:L298N_Shield.jpg|vignette|L298N Shield]]&lt;br /&gt;
[[Fichier:L298P_Shield_V1dot2.jpg|vignette|L298P Shield V1.2]]&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, nous avons tenté de voir si l&#039;équilibre du robot était envisageable sans l&#039;emploi d&#039;une troisième roue. Plusieurs problèmes se sont alors posés : &lt;br /&gt;
&lt;br /&gt;
# La carte de puissance ne commandait qu&#039;un seul moteur&lt;br /&gt;
&lt;br /&gt;
# Le code dans la télécommande et le robot ne fonctionnaient pas&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Correction de la carte de puissance}}===&lt;br /&gt;
&lt;br /&gt;
Afin de vérifier si la carte alimentait convenablement le deuxième moteur, nous avons utilisé un voltmètre. Lors de son utilisation, la carte a cessé d&#039;alimenter le deuxième moteur, nous obligeant à changer la carte [https://www.dfrobot.com/wiki/index.php/Arduino_Motor_Shield_(L298N)_(SKU:DRI0009) L298N Shield] pour une [https://www.dfrobot.com/index.php?route=product/product&amp;amp;product_id=69 L298P Shield V1.2].&lt;br /&gt;
&amp;lt;u&amp;gt;La nouvelle carte de puissance n&#039;alimente pas les cartes Arduino connectées à celle-ci. Il est donc nécessaire de tirer un câble de la batterie jusqu&#039;au Vin de l&#039;Arduino.&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Reprogrammation de la carte du robot}}===&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif ici est de programmer le robot de façon à vérifier si celui-ci est capable de tenir en équilibre ou non, et donc si l&#039;ajout d&#039;une troisième roue est nécessaire.&lt;br /&gt;
&lt;br /&gt;
{{Rouge|&amp;lt;b&amp;gt;Problème :&amp;lt;/b&amp;gt; Durant les tests du programme, une erreur de branchement (12V de la batterie connecté au 5V de l&#039;Arduino) a grillé un ATMEGA328P et l&#039;accéléromètre.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;&amp;lt;u&amp;gt;Code Robot&amp;lt;/u&amp;gt;&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#include &amp;quot;Wire.h&amp;quot;&lt;br /&gt;
#include &amp;quot;SPI.h&amp;quot;  &lt;br /&gt;
#include &amp;quot;Mirf.h&amp;quot;&lt;br /&gt;
#include &amp;quot;nRF24L01.h&amp;quot;&lt;br /&gt;
#include &amp;quot;MirfHardwareSpiDriver.h&amp;quot;&lt;br /&gt;
#include &amp;quot;I2Cdev.h&amp;quot;&lt;br /&gt;
#include &amp;quot;MPU6050.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
//Valeur limite de l&#039;accéléromètre&lt;br /&gt;
#define MAX_READ_ABS 16384&lt;br /&gt;
//Valeur limite des PWM (commande moteur)&lt;br /&gt;
#define MAX_WRITE_ABS 255&lt;br /&gt;
//Offset de l&#039;accéléromètre (valeur mesurée lorsque le robot est à l&#039;horizontal)&lt;br /&gt;
#define OFFSET -2000&lt;br /&gt;
&lt;br /&gt;
const double MAX_READ_NEG = (-MAX_READ_ABS+OFFSET/2.0); //Valeur maximale réelle négative (avec offset) =-17384&lt;br /&gt;
const double MAX_READ_POS = (MAX_READ_ABS+OFFSET/2.0); //Valeur maximale réelle positive (avec offset) =15384&lt;br /&gt;
&lt;br /&gt;
MPU6050 accelgyro;&lt;br /&gt;
int16_t ax, ay, az;&lt;br /&gt;
int16_t gx, gy, gz;&lt;br /&gt;
&lt;br /&gt;
long accelero;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  accelgyro.initialize();&lt;br /&gt;
  for(unsigned char i = 2 ; i &amp;lt;= 5 ; i++)&lt;br /&gt;
  {&lt;br /&gt;
    pinMode(i, OUTPUT);&lt;br /&gt;
  }&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
long getAccelero(long n = 100)&lt;br /&gt;
{&lt;br /&gt;
  long value = 0;&lt;br /&gt;
  for(long i = 0 ; i &amp;lt; n ; i++)&lt;br /&gt;
  {&lt;br /&gt;
    accelgyro.getMotion6(&amp;amp;ax, &amp;amp;ay, &amp;amp;az, &amp;amp;gx, &amp;amp;gy, &amp;amp;gz);&lt;br /&gt;
    value += ay;&lt;br /&gt;
  }  &lt;br /&gt;
  return value/n;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void arreter()&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(2, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void avancer(char n = 50)&lt;br /&gt;
{&lt;br /&gt;
  if(n == 0)&lt;br /&gt;
  {&lt;br /&gt;
    arreter();&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    analogWrite(3,(unsigned char)(MAX_WRITE_ABS - MAX_WRITE_ABS*(100-n)/200.0));&lt;br /&gt;
    analogWrite(5,(unsigned char)(MAX_WRITE_ABS - MAX_WRITE_ABS*(100-n)/200.0));&lt;br /&gt;
    digitalWrite(2,HIGH);&lt;br /&gt;
    digitalWrite(4,HIGH);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void reculer(char n = 50)&lt;br /&gt;
{&lt;br /&gt;
  if(n == 0)&lt;br /&gt;
  {&lt;br /&gt;
    arreter();&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    analogWrite(3,(unsigned char)(MAX_WRITE_ABS*(100-n)/200.0));&lt;br /&gt;
    analogWrite(5,(unsigned char)(MAX_WRITE_ABS*(100-n)/200.0));&lt;br /&gt;
    digitalWrite(2,HIGH);&lt;br /&gt;
    digitalWrite(4,HIGH);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void tourner(char n = 0)&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  bool _stop = 0;&lt;br /&gt;
  &lt;br /&gt;
  accelero = getAccelero(1);&lt;br /&gt;
  Serial.println(accelero);&lt;br /&gt;
  if(_stop)&lt;br /&gt;
  {&lt;br /&gt;
    if(accelero &amp;gt; 0.9*MAX_READ_POS || accelero &amp;lt; 0.9*MAX_READ_NEG)&lt;br /&gt;
    {&lt;br /&gt;
      arreter();&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
      if(accelero &amp;lt; OFFSET)&lt;br /&gt;
      {&lt;br /&gt;
        reculer(accelero/(0.9*MAX_READ_NEG)*100);&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        avancer(accelero/(0.9*MAX_READ_POS)*100);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    arreter();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#A000E0&amp;quot;&amp;gt;Limites&amp;lt;/span&amp;gt;====&lt;br /&gt;
* Les tests ont révélé une incompatibilité réactivité/pertinence. L&#039;accéléromètre donnant souvent des valeurs incohérentes, il était nécessaire d&#039;échantillonner ces valeurs. Plus l&#039;échantillon est important et moins le robot était réactif. Mais moins l&#039;échantillon est important, moins le robot se retrouve capable de réagir correctement (il accélère parfois dans le mauvais sens à cause d&#039;une valeur d&#039;accéléromètre erronée).&lt;br /&gt;
* Les moteurs ne réagissent pas assez rapidement à une commande, rendant l&#039;équilibre quasi-impossible.&lt;br /&gt;
&lt;br /&gt;
=={{Vert|Ajout d&#039;une troisième roue}}==&lt;br /&gt;
[[Fichier:Roue_folle.jpg|vignette|Roue folle]]&lt;br /&gt;
&lt;br /&gt;
L&#039;équilibre étant infaisable, nous avons donc ajouté une troisième roue dite &amp;quot;folle&amp;quot;.&lt;br /&gt;
Le côté qui nous a posé le plus de problèmes ici est la programmation du robot. En effet, après avoir « finit » celle-ci, nous avons remarqué que le comportement du robot était aléatoire et instable. Après le test des moteurs, nous en avons conclus que {{Rouge|&amp;lt;u&amp;gt;la documentation sur la carte de puissance est erronée, rendant le programme réalisé faux.&amp;lt;/u&amp;gt;}} Les corrections suivantes sont apportées :&lt;br /&gt;
* Le sens des moteurs est donné par les pins M1 et M2 ;&lt;br /&gt;
* La vitesse des moteurs est commandée en PWM 8bits par les pins E1 et E2 ;&lt;br /&gt;
Cette deuxième modification de la documentation apporte un nouveau problème : les pins E1 et E2 sont physiquement reliées aux pattes 5 et 6 qui ne sont pas des PWM. Nous les avons donc reliées aux pattes 9 pour la 5 et 10 pour la 6. Le programme s&#039;en retrouve très simplifié.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:remote.zip|&amp;lt;u&amp;gt;Code de la télécommande&amp;lt;/u&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:robot.zip|&amp;lt;u&amp;gt;Code du robot&amp;lt;/u&amp;gt;]]&lt;/div&gt;</summary>
		<author><name>Balancing</name></author>
	</entry>
	<entry>
		<id>https://wikigeii.iut-troyes.univ-reims.fr/index.php?title=Balancingbot&amp;diff=8934</id>
		<title>Balancingbot</title>
		<link rel="alternate" type="text/html" href="https://wikigeii.iut-troyes.univ-reims.fr/index.php?title=Balancingbot&amp;diff=8934"/>
		<updated>2017-01-11T16:17:11Z</updated>

		<summary type="html">&lt;p&gt;Balancing : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;={{Rouge|Projet 2016/2017 : Villette - Vin}}=&lt;br /&gt;
&lt;br /&gt;
=={{Vert|Tentative d&#039;équilibre sans troisième roue}}==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:L298N_Shield.jpg|vignette|L298N Shield]]&lt;br /&gt;
[[Fichier:L298P_Shield_V1dot2.jpg|vignette|L298P Shield V1.2]]&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, nous avons tenté de voir si l&#039;équilibre du robot était envisageable sans l&#039;emploi d&#039;une troisième roue. Plusieurs problèmes se sont alors posés : &lt;br /&gt;
&lt;br /&gt;
# La carte de puissance ne commandait qu&#039;un seul moteur&lt;br /&gt;
&lt;br /&gt;
# Le code dans la télécommande et le robot ne fonctionnaient pas&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Correction de la carte de puissance}}===&lt;br /&gt;
&lt;br /&gt;
Afin de vérifier si la carte alimentait convenablement le deuxième moteur, nous avons utilisé un voltmètre. Lors de son utilisation, la carte a cessé d&#039;alimenter le deuxième moteur, nous obligeant à changer la carte [https://www.dfrobot.com/wiki/index.php/Arduino_Motor_Shield_(L298N)_(SKU:DRI0009) L298N Shield] pour une [https://www.dfrobot.com/index.php?route=product/product&amp;amp;product_id=69 L298P Shield V1.2].&lt;br /&gt;
&amp;lt;u&amp;gt;La nouvelle carte de puissance n&#039;alimente pas les cartes Arduino connectées à celle-ci. Il est donc nécessaire de tirer un câble de la batterie jusqu&#039;au Vin de l&#039;Arduino.&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Reprogrammation de la carte du robot}}===&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif ici est de programmer le robot de façon à vérifier si celui-ci est capable de tenir en équilibre ou non, et donc si l&#039;ajout d&#039;une troisième roue est nécessaire.&lt;br /&gt;
&lt;br /&gt;
{{Rouge|&amp;lt;b&amp;gt;Problème :&amp;lt;/b&amp;gt; Durant les tests du programme, une erreur de branchement (12V de la batterie connecté au 5V de l&#039;Arduino) a grillé un ATMEGA328P et l&#039;accéléromètre.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;&amp;lt;u&amp;gt;Code Robot&amp;lt;/u&amp;gt;&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#include &amp;quot;Wire.h&amp;quot;&lt;br /&gt;
#include &amp;quot;SPI.h&amp;quot;  &lt;br /&gt;
#include &amp;quot;Mirf.h&amp;quot;&lt;br /&gt;
#include &amp;quot;nRF24L01.h&amp;quot;&lt;br /&gt;
#include &amp;quot;MirfHardwareSpiDriver.h&amp;quot;&lt;br /&gt;
#include &amp;quot;I2Cdev.h&amp;quot;&lt;br /&gt;
#include &amp;quot;MPU6050.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
//Valeur limite de l&#039;accéléromètre&lt;br /&gt;
#define MAX_READ_ABS 16384&lt;br /&gt;
//Valeur limite des PWM (commande moteur)&lt;br /&gt;
#define MAX_WRITE_ABS 255&lt;br /&gt;
//Offset de l&#039;accéléromètre (valeur mesurée lorsque le robot est à l&#039;horizontal)&lt;br /&gt;
#define OFFSET -2000&lt;br /&gt;
&lt;br /&gt;
const double MAX_READ_NEG = (-MAX_READ_ABS+OFFSET/2.0); //Valeur maximale réelle négative (avec offset) =-17384&lt;br /&gt;
const double MAX_READ_POS = (MAX_READ_ABS+OFFSET/2.0); //Valeur maximale réelle positive (avec offset) =15384&lt;br /&gt;
&lt;br /&gt;
MPU6050 accelgyro;&lt;br /&gt;
int16_t ax, ay, az;&lt;br /&gt;
int16_t gx, gy, gz;&lt;br /&gt;
&lt;br /&gt;
long accelero;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  accelgyro.initialize();&lt;br /&gt;
  for(unsigned char i = 2 ; i &amp;lt;= 5 ; i++)&lt;br /&gt;
  {&lt;br /&gt;
    pinMode(i, OUTPUT);&lt;br /&gt;
  }&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
long getAccelero(long n = 100)&lt;br /&gt;
{&lt;br /&gt;
  long value = 0;&lt;br /&gt;
  for(long i = 0 ; i &amp;lt; n ; i++)&lt;br /&gt;
  {&lt;br /&gt;
    accelgyro.getMotion6(&amp;amp;ax, &amp;amp;ay, &amp;amp;az, &amp;amp;gx, &amp;amp;gy, &amp;amp;gz);&lt;br /&gt;
    value += ay;&lt;br /&gt;
  }  &lt;br /&gt;
  return value/n;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void arreter()&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(2, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void avancer(char n = 50)&lt;br /&gt;
{&lt;br /&gt;
  if(n == 0)&lt;br /&gt;
  {&lt;br /&gt;
    arreter();&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    analogWrite(3,(unsigned char)(MAX_WRITE_ABS - MAX_WRITE_ABS*(100-n)/200.0));&lt;br /&gt;
    analogWrite(5,(unsigned char)(MAX_WRITE_ABS - MAX_WRITE_ABS*(100-n)/200.0));&lt;br /&gt;
    digitalWrite(2,HIGH);&lt;br /&gt;
    digitalWrite(4,HIGH);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void reculer(char n = 50)&lt;br /&gt;
{&lt;br /&gt;
  if(n == 0)&lt;br /&gt;
  {&lt;br /&gt;
    arreter();&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    analogWrite(3,(unsigned char)(MAX_WRITE_ABS*(100-n)/200.0));&lt;br /&gt;
    analogWrite(5,(unsigned char)(MAX_WRITE_ABS*(100-n)/200.0));&lt;br /&gt;
    digitalWrite(2,HIGH);&lt;br /&gt;
    digitalWrite(4,HIGH);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void tourner(char n = 0)&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  bool _stop = 0;&lt;br /&gt;
  &lt;br /&gt;
  accelero = getAccelero(1);&lt;br /&gt;
  Serial.println(accelero);&lt;br /&gt;
  if(_stop)&lt;br /&gt;
  {&lt;br /&gt;
    if(accelero &amp;gt; 0.9*MAX_READ_POS || accelero &amp;lt; 0.9*MAX_READ_NEG)&lt;br /&gt;
    {&lt;br /&gt;
      arreter();&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
      if(accelero &amp;lt; OFFSET)&lt;br /&gt;
      {&lt;br /&gt;
        reculer(accelero/(0.9*MAX_READ_NEG)*100);&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        avancer(accelero/(0.9*MAX_READ_POS)*100);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    arreter();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#A000E0&amp;quot;&amp;gt;Limites&amp;lt;/span&amp;gt;====&lt;br /&gt;
* Les tests ont révélé une incompatibilité réactivité/pertinence. L&#039;accéléromètre donnant souvent des valeurs incohérentes, il était nécessaire d&#039;échantillonner ces valeurs. Plus l&#039;échantillon est important et moins le robot était réactif. Mais moins l&#039;échantillon est important, moins le robot se retrouve capable de réagir correctement (il accélère parfois dans le mauvais sens à cause d&#039;une valeur d&#039;accéléromètre erronée).&lt;br /&gt;
* Les moteurs ne réagissent pas assez rapidement à une commande, rendant l&#039;équilibre quasi-impossible.&lt;br /&gt;
&lt;br /&gt;
=={{Vert|Ajout d&#039;une troisième roue}}==&lt;br /&gt;
[[Fichier:Roue_folle.jpg|vignette|Roue folle]]&lt;br /&gt;
&lt;br /&gt;
L&#039;équilibre étant infaisable, nous avons donc ajouté une troisième roue dite &amp;quot;folle&amp;quot;.&lt;br /&gt;
Le côté qui nous a posé le plus de problèmes ici est la programmation du robot. En effet, après avoir « finit » celle-ci, nous avons remarqué que le comportement du robot était aléatoire et instable. Après le test des moteurs, nous en avons conclus que {{Rouge|&amp;lt;u&amp;gt;la documentation sur la carte de puissance est erronée, rendant le programme réalisé faux.&amp;lt;/u&amp;gt;}} Les corrections suivantes sont apportées :&lt;br /&gt;
* Le sens des moteurs est donné par les pins M1 et M2 ;&lt;br /&gt;
* La vitesse des moteurs est commandée en PWM 8bits par les pins E1 et E2 ;&lt;br /&gt;
Cette deuxième modification de la documentation apporte un nouveau problème : les pins E1 et E2 sont physiquement reliées aux pattes 5 et 6 qui ne sont pas des PWM. Nous les avons donc reliées aux pattes 9 pour la 5 et 10 pour la 6. Le programme s&#039;en retrouve très simplifié.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:remote.zip|&amp;lt;u&amp;gt;Code de la télécommande&amp;lt;/u&amp;gt;]]&lt;br /&gt;
[[Fichier:robot.zip|&amp;lt;u&amp;gt;Code du robot&amp;lt;/u&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Code du robot&amp;lt;/u&amp;gt;&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Balancing</name></author>
	</entry>
	<entry>
		<id>https://wikigeii.iut-troyes.univ-reims.fr/index.php?title=Balancingbot&amp;diff=8933</id>
		<title>Balancingbot</title>
		<link rel="alternate" type="text/html" href="https://wikigeii.iut-troyes.univ-reims.fr/index.php?title=Balancingbot&amp;diff=8933"/>
		<updated>2017-01-11T16:15:53Z</updated>

		<summary type="html">&lt;p&gt;Balancing : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;={{Rouge|Projet 2016/2017 : Villette - Vin}}=&lt;br /&gt;
&lt;br /&gt;
=={{Vert|Tentative d&#039;équilibre sans troisième roue}}==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:L298N_Shield.jpg|vignette|L298N Shield]]&lt;br /&gt;
[[Fichier:L298P_Shield_V1dot2.jpg|vignette|L298P Shield V1.2]]&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, nous avons tenté de voir si l&#039;équilibre du robot était envisageable sans l&#039;emploi d&#039;une troisième roue. Plusieurs problèmes se sont alors posés : &lt;br /&gt;
&lt;br /&gt;
# La carte de puissance ne commandait qu&#039;un seul moteur&lt;br /&gt;
&lt;br /&gt;
# Le code dans la télécommande et le robot ne fonctionnaient pas&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Correction de la carte de puissance}}===&lt;br /&gt;
&lt;br /&gt;
Afin de vérifier si la carte alimentait convenablement le deuxième moteur, nous avons utilisé un voltmètre. Lors de son utilisation, la carte a cessé d&#039;alimenter le deuxième moteur, nous obligeant à changer la carte [https://www.dfrobot.com/wiki/index.php/Arduino_Motor_Shield_(L298N)_(SKU:DRI0009) L298N Shield] pour une [https://www.dfrobot.com/index.php?route=product/product&amp;amp;product_id=69 L298P Shield V1.2].&lt;br /&gt;
&amp;lt;u&amp;gt;La nouvelle carte de puissance n&#039;alimente pas les cartes Arduino connectées à celle-ci. Il est donc nécessaire de tirer un câble de la batterie jusqu&#039;au Vin de l&#039;Arduino.&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Reprogrammation de la carte du robot}}===&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif ici est de programmer le robot de façon à vérifier si celui-ci est capable de tenir en équilibre ou non, et donc si l&#039;ajout d&#039;une troisième roue est nécessaire.&lt;br /&gt;
&lt;br /&gt;
{{Rouge|&amp;lt;b&amp;gt;Problème :&amp;lt;/b&amp;gt; Durant les tests du programme, une erreur de branchement (12V de la batterie connecté au 5V de l&#039;Arduino) a grillé un ATMEGA328P et l&#039;accéléromètre.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;&amp;lt;u&amp;gt;Code Robot&amp;lt;/u&amp;gt;&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#include &amp;quot;Wire.h&amp;quot;&lt;br /&gt;
#include &amp;quot;SPI.h&amp;quot;  &lt;br /&gt;
#include &amp;quot;Mirf.h&amp;quot;&lt;br /&gt;
#include &amp;quot;nRF24L01.h&amp;quot;&lt;br /&gt;
#include &amp;quot;MirfHardwareSpiDriver.h&amp;quot;&lt;br /&gt;
#include &amp;quot;I2Cdev.h&amp;quot;&lt;br /&gt;
#include &amp;quot;MPU6050.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
//Valeur limite de l&#039;accéléromètre&lt;br /&gt;
#define MAX_READ_ABS 16384&lt;br /&gt;
//Valeur limite des PWM (commande moteur)&lt;br /&gt;
#define MAX_WRITE_ABS 255&lt;br /&gt;
//Offset de l&#039;accéléromètre (valeur mesurée lorsque le robot est à l&#039;horizontal)&lt;br /&gt;
#define OFFSET -2000&lt;br /&gt;
&lt;br /&gt;
const double MAX_READ_NEG = (-MAX_READ_ABS+OFFSET/2.0); //Valeur maximale réelle négative (avec offset) =-17384&lt;br /&gt;
const double MAX_READ_POS = (MAX_READ_ABS+OFFSET/2.0); //Valeur maximale réelle positive (avec offset) =15384&lt;br /&gt;
&lt;br /&gt;
MPU6050 accelgyro;&lt;br /&gt;
int16_t ax, ay, az;&lt;br /&gt;
int16_t gx, gy, gz;&lt;br /&gt;
&lt;br /&gt;
long accelero;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  accelgyro.initialize();&lt;br /&gt;
  for(unsigned char i = 2 ; i &amp;lt;= 5 ; i++)&lt;br /&gt;
  {&lt;br /&gt;
    pinMode(i, OUTPUT);&lt;br /&gt;
  }&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
long getAccelero(long n = 100)&lt;br /&gt;
{&lt;br /&gt;
  long value = 0;&lt;br /&gt;
  for(long i = 0 ; i &amp;lt; n ; i++)&lt;br /&gt;
  {&lt;br /&gt;
    accelgyro.getMotion6(&amp;amp;ax, &amp;amp;ay, &amp;amp;az, &amp;amp;gx, &amp;amp;gy, &amp;amp;gz);&lt;br /&gt;
    value += ay;&lt;br /&gt;
  }  &lt;br /&gt;
  return value/n;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void arreter()&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(2, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void avancer(char n = 50)&lt;br /&gt;
{&lt;br /&gt;
  if(n == 0)&lt;br /&gt;
  {&lt;br /&gt;
    arreter();&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    analogWrite(3,(unsigned char)(MAX_WRITE_ABS - MAX_WRITE_ABS*(100-n)/200.0));&lt;br /&gt;
    analogWrite(5,(unsigned char)(MAX_WRITE_ABS - MAX_WRITE_ABS*(100-n)/200.0));&lt;br /&gt;
    digitalWrite(2,HIGH);&lt;br /&gt;
    digitalWrite(4,HIGH);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void reculer(char n = 50)&lt;br /&gt;
{&lt;br /&gt;
  if(n == 0)&lt;br /&gt;
  {&lt;br /&gt;
    arreter();&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    analogWrite(3,(unsigned char)(MAX_WRITE_ABS*(100-n)/200.0));&lt;br /&gt;
    analogWrite(5,(unsigned char)(MAX_WRITE_ABS*(100-n)/200.0));&lt;br /&gt;
    digitalWrite(2,HIGH);&lt;br /&gt;
    digitalWrite(4,HIGH);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void tourner(char n = 0)&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  bool _stop = 0;&lt;br /&gt;
  &lt;br /&gt;
  accelero = getAccelero(1);&lt;br /&gt;
  Serial.println(accelero);&lt;br /&gt;
  if(_stop)&lt;br /&gt;
  {&lt;br /&gt;
    if(accelero &amp;gt; 0.9*MAX_READ_POS || accelero &amp;lt; 0.9*MAX_READ_NEG)&lt;br /&gt;
    {&lt;br /&gt;
      arreter();&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
      if(accelero &amp;lt; OFFSET)&lt;br /&gt;
      {&lt;br /&gt;
        reculer(accelero/(0.9*MAX_READ_NEG)*100);&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        avancer(accelero/(0.9*MAX_READ_POS)*100);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    arreter();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#A000E0&amp;quot;&amp;gt;Limites&amp;lt;/span&amp;gt;====&lt;br /&gt;
* Les tests ont révélé une incompatibilité réactivité/pertinence. L&#039;accéléromètre donnant souvent des valeurs incohérentes, il était nécessaire d&#039;échantillonner ces valeurs. Plus l&#039;échantillon est important et moins le robot était réactif. Mais moins l&#039;échantillon est important, moins le robot se retrouve capable de réagir correctement (il accélère parfois dans le mauvais sens à cause d&#039;une valeur d&#039;accéléromètre erronée).&lt;br /&gt;
* Les moteurs ne réagissent pas assez rapidement à une commande, rendant l&#039;équilibre quasi-impossible.&lt;br /&gt;
&lt;br /&gt;
=={{Vert|Ajout d&#039;une troisième roue}}==&lt;br /&gt;
[[Fichier:Roue_folle.jpg|vignette|Roue folle]]&lt;br /&gt;
&lt;br /&gt;
L&#039;équilibre étant infaisable, nous avons donc ajouté une troisième roue dite &amp;quot;folle&amp;quot;.&lt;br /&gt;
Le côté qui nous a posé le plus de problèmes ici est la programmation du robot. En effet, après avoir « finit » celle-ci, nous avons remarqué que le comportement du robot était aléatoire et instable. Après le test des moteurs, nous en avons conclus que {{Rouge|&amp;lt;u&amp;gt;la documentation sur la carte de puissance est erronée, rendant le programme réalisé faux.&amp;lt;/u&amp;gt;}} Les corrections suivantes sont apportées :&lt;br /&gt;
* Le sens des moteurs est donné par les pins M1 et M2 ;&lt;br /&gt;
* La vitesse des moteurs est commandée en PWM 8bits par les pins E1 et E2 ;&lt;br /&gt;
Cette deuxième modification de la documentation apporte un nouveau problème : les pins E1 et E2 sont physiquement reliées aux pattes 5 et 6 qui ne sont pas des PWM. Nous les avons donc reliées aux pattes 9 pour la 5 et 10 pour la 6. Le programme s&#039;en retrouve très simplifié.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:remote.ino|&amp;lt;u&amp;gt;Code de la télécommande&amp;lt;/u&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Code du robot&amp;lt;/u&amp;gt;&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Balancing</name></author>
	</entry>
	<entry>
		<id>https://wikigeii.iut-troyes.univ-reims.fr/index.php?title=Fichier:Roue_folle.jpg&amp;diff=8931</id>
		<title>Fichier:Roue folle.jpg</title>
		<link rel="alternate" type="text/html" href="https://wikigeii.iut-troyes.univ-reims.fr/index.php?title=Fichier:Roue_folle.jpg&amp;diff=8931"/>
		<updated>2017-01-11T15:52:15Z</updated>

		<summary type="html">&lt;p&gt;Balancing : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Balancing</name></author>
	</entry>
	<entry>
		<id>https://wikigeii.iut-troyes.univ-reims.fr/index.php?title=Balancingbot&amp;diff=8930</id>
		<title>Balancingbot</title>
		<link rel="alternate" type="text/html" href="https://wikigeii.iut-troyes.univ-reims.fr/index.php?title=Balancingbot&amp;diff=8930"/>
		<updated>2017-01-11T15:50:11Z</updated>

		<summary type="html">&lt;p&gt;Balancing : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;={{Rouge|Projet 2016/2017 : Villette - Vin}}=&lt;br /&gt;
&lt;br /&gt;
=={{Vert|Tentative d&#039;équilibre sans troisième roue}}==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:L298N_Shield.jpg|vignette|L298N Shield]]&lt;br /&gt;
[[Fichier:L298P_Shield_V1dot2.jpg|vignette|L298P Shield V1.2]]&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, nous avons tenté de voir si l&#039;équilibre du robot était envisageable sans l&#039;emploi d&#039;une troisième roue. Plusieurs problèmes se sont alors posés : &lt;br /&gt;
&lt;br /&gt;
# La carte de puissance ne commandait qu&#039;un seul moteur&lt;br /&gt;
&lt;br /&gt;
# Le code dans la télécommande et le robot ne fonctionnaient pas&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Correction de la carte de puissance}}===&lt;br /&gt;
&lt;br /&gt;
Afin de vérifier si la carte alimentait convenablement le deuxième moteur, nous avons utilisé un voltmètre. Lors de son utilisation, la carte a cessé d&#039;alimenter le deuxième moteur, nous obligeant à changer la carte [https://www.dfrobot.com/wiki/index.php/Arduino_Motor_Shield_(L298N)_(SKU:DRI0009) L298N Shield] pour une [https://www.dfrobot.com/index.php?route=product/product&amp;amp;product_id=69 L298P Shield V1.2].&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Reprogrammation de la carte du robot}}===&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif ici est de programmer le robot de façon à vérifier si celui-ci est capable de tenir en équilibre ou non, et donc si l&#039;ajout d&#039;une troisième roue est nécessaire.&lt;br /&gt;
&lt;br /&gt;
{{Rouge|&amp;lt;b&amp;gt;Problème :&amp;lt;/b&amp;gt; Durant les tests du programme, une erreur de branchement (12V de la batterie connecté au 5V de l&#039;Arduino) a grillé un ATMEGA328P et l&#039;accéléromètre.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;&amp;lt;u&amp;gt;Code Robot&amp;lt;/u&amp;gt;&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#include &amp;quot;Wire.h&amp;quot;&lt;br /&gt;
#include &amp;quot;SPI.h&amp;quot;  &lt;br /&gt;
#include &amp;quot;Mirf.h&amp;quot;&lt;br /&gt;
#include &amp;quot;nRF24L01.h&amp;quot;&lt;br /&gt;
#include &amp;quot;MirfHardwareSpiDriver.h&amp;quot;&lt;br /&gt;
#include &amp;quot;I2Cdev.h&amp;quot;&lt;br /&gt;
#include &amp;quot;MPU6050.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
//Valeur limite de l&#039;accéléromètre&lt;br /&gt;
#define MAX_READ_ABS 16384&lt;br /&gt;
//Valeur limite des PWM (commande moteur)&lt;br /&gt;
#define MAX_WRITE_ABS 255&lt;br /&gt;
//Offset de l&#039;accéléromètre (valeur mesurée lorsque le robot est à l&#039;horizontal)&lt;br /&gt;
#define OFFSET -2000&lt;br /&gt;
&lt;br /&gt;
const double MAX_READ_NEG = (-MAX_READ_ABS+OFFSET/2.0); //Valeur maximale réelle négative (avec offset) =-17384&lt;br /&gt;
const double MAX_READ_POS = (MAX_READ_ABS+OFFSET/2.0); //Valeur maximale réelle positive (avec offset) =15384&lt;br /&gt;
&lt;br /&gt;
MPU6050 accelgyro;&lt;br /&gt;
int16_t ax, ay, az;&lt;br /&gt;
int16_t gx, gy, gz;&lt;br /&gt;
&lt;br /&gt;
long accelero;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  accelgyro.initialize();&lt;br /&gt;
  for(unsigned char i = 2 ; i &amp;lt;= 5 ; i++)&lt;br /&gt;
  {&lt;br /&gt;
    pinMode(i, OUTPUT);&lt;br /&gt;
  }&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
long getAccelero(long n = 100)&lt;br /&gt;
{&lt;br /&gt;
  long value = 0;&lt;br /&gt;
  for(long i = 0 ; i &amp;lt; n ; i++)&lt;br /&gt;
  {&lt;br /&gt;
    accelgyro.getMotion6(&amp;amp;ax, &amp;amp;ay, &amp;amp;az, &amp;amp;gx, &amp;amp;gy, &amp;amp;gz);&lt;br /&gt;
    value += ay;&lt;br /&gt;
  }  &lt;br /&gt;
  return value/n;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void arreter()&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(2, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void avancer(char n = 50)&lt;br /&gt;
{&lt;br /&gt;
  if(n == 0)&lt;br /&gt;
  {&lt;br /&gt;
    arreter();&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    analogWrite(3,(unsigned char)(MAX_WRITE_ABS - MAX_WRITE_ABS*(100-n)/200.0));&lt;br /&gt;
    analogWrite(5,(unsigned char)(MAX_WRITE_ABS - MAX_WRITE_ABS*(100-n)/200.0));&lt;br /&gt;
    digitalWrite(2,HIGH);&lt;br /&gt;
    digitalWrite(4,HIGH);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void reculer(char n = 50)&lt;br /&gt;
{&lt;br /&gt;
  if(n == 0)&lt;br /&gt;
  {&lt;br /&gt;
    arreter();&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    analogWrite(3,(unsigned char)(MAX_WRITE_ABS*(100-n)/200.0));&lt;br /&gt;
    analogWrite(5,(unsigned char)(MAX_WRITE_ABS*(100-n)/200.0));&lt;br /&gt;
    digitalWrite(2,HIGH);&lt;br /&gt;
    digitalWrite(4,HIGH);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void tourner(char n = 0)&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  bool _stop = 0;&lt;br /&gt;
  &lt;br /&gt;
  accelero = getAccelero(1);&lt;br /&gt;
  Serial.println(accelero);&lt;br /&gt;
  if(_stop)&lt;br /&gt;
  {&lt;br /&gt;
    if(accelero &amp;gt; 0.9*MAX_READ_POS || accelero &amp;lt; 0.9*MAX_READ_NEG)&lt;br /&gt;
    {&lt;br /&gt;
      arreter();&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
      if(accelero &amp;lt; OFFSET)&lt;br /&gt;
      {&lt;br /&gt;
        reculer(accelero/(0.9*MAX_READ_NEG)*100);&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        avancer(accelero/(0.9*MAX_READ_POS)*100);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    arreter();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#A000E0&amp;quot;&amp;gt;Limites&amp;lt;/span&amp;gt;====&lt;br /&gt;
* Les tests ont révélé une incompatibilité réactivité/pertinence. L&#039;accéléromètre donnant souvent des valeurs incohérentes, il était nécessaire d&#039;échantillonner ces valeurs. Plus l&#039;échantillon est important et moins le robot était réactif. Mais moins l&#039;échantillon est important, moins le robot se retrouve capable de réagir correctement (il accélère parfois dans le mauvais sens à cause d&#039;une valeur d&#039;accéléromètre erronée).&lt;br /&gt;
* Les moteurs ne réagissent pas assez rapidement à une commande, rendant l&#039;équilibre quasi-impossible.&lt;br /&gt;
&lt;br /&gt;
=={{Vert|Ajout d&#039;une troisième roue}}==&lt;br /&gt;
[[Fichier:Roue_folle.jpg|vignette|Roue folle]]&lt;br /&gt;
&lt;br /&gt;
L&#039;équilibre étant infaisable, nous avons donc ajouté une troisième roue dite &amp;quot;folle&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Balancing</name></author>
	</entry>
	<entry>
		<id>https://wikigeii.iut-troyes.univ-reims.fr/index.php?title=Balancingbot&amp;diff=8922</id>
		<title>Balancingbot</title>
		<link rel="alternate" type="text/html" href="https://wikigeii.iut-troyes.univ-reims.fr/index.php?title=Balancingbot&amp;diff=8922"/>
		<updated>2017-01-10T11:34:17Z</updated>

		<summary type="html">&lt;p&gt;Balancing : /* {{Bleu|Reprogrammation de la carte du robot}} */  Ajout d&amp;#039;un point&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;={{Rouge|Projet 2016/2017 : Villette - Vin}}=&lt;br /&gt;
&lt;br /&gt;
=={{Vert|Tentative d&#039;équilibre dans deuxième roue}}==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:L298N_Shield.jpg|vignette|L298N Shield]]&lt;br /&gt;
[[Fichier:L298P_Shield_V1dot2.jpg|vignette|L298P Shield V1.2]]&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, nous avons tenté de voir si l&#039;équilibre du robot était envisageable sans l&#039;emploi d&#039;une troisième roue. Plusieurs problèmes se sont alors posés : &lt;br /&gt;
&lt;br /&gt;
# La carte de puissance ne commandait qu&#039;un seul moteur&lt;br /&gt;
&lt;br /&gt;
# Le code dans la télécommande et le robot ne fonctionnaient pas&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Correction de la carte de puissance}}===&lt;br /&gt;
&lt;br /&gt;
Afin de vérifier si la carte alimentait convenablement le deuxième moteur, nous avons utilisé un voltmètre. Lors de son utilisation, la carte a cessé d&#039;alimenter le deuxième moteur, nous obligeant à changer la carte [https://www.dfrobot.com/wiki/index.php/Arduino_Motor_Shield_(L298N)_(SKU:DRI0009) L298N Shield] pour une [https://www.dfrobot.com/index.php?route=product/product&amp;amp;product_id=69 L298P Shield V1.2].&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Reprogrammation de la carte du robot}}===&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif ici est de programmer le robot de façon à vérifier si celui-ci est capable de tenir en équilibre ou non, et donc si l&#039;ajout d&#039;une troisième roue est nécessaire.&lt;br /&gt;
&lt;br /&gt;
{{Rouge|&amp;lt;b&amp;gt;Problème :&amp;lt;/b&amp;gt; Durant les tests du programme, une erreur de branchement (12V de la batterie connecté au 5V de l&#039;Arduino) a grillé un ATMEGA328P et l&#039;accéléromètre.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;&amp;lt;u&amp;gt;Code Robot&amp;lt;/u&amp;gt;&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#include &amp;quot;Wire.h&amp;quot;&lt;br /&gt;
#include &amp;quot;SPI.h&amp;quot;  &lt;br /&gt;
#include &amp;quot;Mirf.h&amp;quot;&lt;br /&gt;
#include &amp;quot;nRF24L01.h&amp;quot;&lt;br /&gt;
#include &amp;quot;MirfHardwareSpiDriver.h&amp;quot;&lt;br /&gt;
#include &amp;quot;I2Cdev.h&amp;quot;&lt;br /&gt;
#include &amp;quot;MPU6050.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
//Valeur limite de l&#039;accéléromètre&lt;br /&gt;
#define MAX_READ_ABS 16384&lt;br /&gt;
//Valeur limite des PWM (commande moteur)&lt;br /&gt;
#define MAX_WRITE_ABS 255&lt;br /&gt;
//Offset de l&#039;accéléromètre (valeur mesurée lorsque le robot est à l&#039;horizontal)&lt;br /&gt;
#define OFFSET -2000&lt;br /&gt;
&lt;br /&gt;
const double MAX_READ_NEG = (-MAX_READ_ABS+OFFSET/2.0); //Valeur maximale réelle négative (avec offset) =-17384&lt;br /&gt;
const double MAX_READ_POS = (MAX_READ_ABS+OFFSET/2.0); //Valeur maximale réelle positive (avec offset) =15384&lt;br /&gt;
&lt;br /&gt;
MPU6050 accelgyro;&lt;br /&gt;
int16_t ax, ay, az;&lt;br /&gt;
int16_t gx, gy, gz;&lt;br /&gt;
&lt;br /&gt;
long accelero;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  accelgyro.initialize();&lt;br /&gt;
  for(unsigned char i = 2 ; i &amp;lt;= 5 ; i++)&lt;br /&gt;
  {&lt;br /&gt;
    pinMode(i, OUTPUT);&lt;br /&gt;
  }&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
long getAccelero(long n = 100)&lt;br /&gt;
{&lt;br /&gt;
  long value = 0;&lt;br /&gt;
  for(long i = 0 ; i &amp;lt; n ; i++)&lt;br /&gt;
  {&lt;br /&gt;
    accelgyro.getMotion6(&amp;amp;ax, &amp;amp;ay, &amp;amp;az, &amp;amp;gx, &amp;amp;gy, &amp;amp;gz);&lt;br /&gt;
    value += ay;&lt;br /&gt;
  }  &lt;br /&gt;
  return value/n;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void arreter()&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(2, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void avancer(char n = 50)&lt;br /&gt;
{&lt;br /&gt;
  if(n == 0)&lt;br /&gt;
  {&lt;br /&gt;
    arreter();&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    analogWrite(3,(unsigned char)(MAX_WRITE_ABS - MAX_WRITE_ABS*(100-n)/200.0));&lt;br /&gt;
    analogWrite(5,(unsigned char)(MAX_WRITE_ABS - MAX_WRITE_ABS*(100-n)/200.0));&lt;br /&gt;
    digitalWrite(2,HIGH);&lt;br /&gt;
    digitalWrite(4,HIGH);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void reculer(char n = 50)&lt;br /&gt;
{&lt;br /&gt;
  if(n == 0)&lt;br /&gt;
  {&lt;br /&gt;
    arreter();&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    analogWrite(3,(unsigned char)(MAX_WRITE_ABS*(100-n)/200.0));&lt;br /&gt;
    analogWrite(5,(unsigned char)(MAX_WRITE_ABS*(100-n)/200.0));&lt;br /&gt;
    digitalWrite(2,HIGH);&lt;br /&gt;
    digitalWrite(4,HIGH);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void tourner(char n = 0)&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  bool _stop = 0;&lt;br /&gt;
  &lt;br /&gt;
  accelero = getAccelero(1);&lt;br /&gt;
  Serial.println(accelero);&lt;br /&gt;
  if(_stop)&lt;br /&gt;
  {&lt;br /&gt;
    if(accelero &amp;gt; 0.9*MAX_READ_POS || accelero &amp;lt; 0.9*MAX_READ_NEG)&lt;br /&gt;
    {&lt;br /&gt;
      arreter();&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
      if(accelero &amp;lt; OFFSET)&lt;br /&gt;
      {&lt;br /&gt;
        reculer(accelero/(0.9*MAX_READ_NEG)*100);&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        avancer(accelero/(0.9*MAX_READ_POS)*100);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    arreter();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#A000E0&amp;quot;&amp;gt;Limites&amp;lt;/span&amp;gt;====&lt;br /&gt;
* Les tests ont révélé une incompatibilité réactivité/pertinence. L&#039;accéléromètre donnant souvent des valeurs incohérentes, il était nécessaire d&#039;échantillonner ces valeurs. Plus l&#039;échantillon est important et moins le robot était réactif. Mais moins l&#039;échantillon est important, moins le robot se retrouve capable de réagir correctement (il accélère parfois dans le mauvais sens à cause d&#039;une valeur d&#039;accéléromètre erronée).&lt;br /&gt;
* Les moteurs ne réagissent pas assez rapidement à une commande, rendant l&#039;équilibre quasi-impossible.&lt;/div&gt;</summary>
		<author><name>Balancing</name></author>
	</entry>
	<entry>
		<id>https://wikigeii.iut-troyes.univ-reims.fr/index.php?title=Balancingbot&amp;diff=8920</id>
		<title>Balancingbot</title>
		<link rel="alternate" type="text/html" href="https://wikigeii.iut-troyes.univ-reims.fr/index.php?title=Balancingbot&amp;diff=8920"/>
		<updated>2017-01-10T11:33:26Z</updated>

		<summary type="html">&lt;p&gt;Balancing : Création du compte rendu Villette - Vin&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;={{Rouge|Projet 2016/2017 : Villette - Vin}}=&lt;br /&gt;
&lt;br /&gt;
=={{Vert|Tentative d&#039;équilibre dans deuxième roue}}==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:L298N_Shield.jpg|vignette|L298N Shield]]&lt;br /&gt;
[[Fichier:L298P_Shield_V1dot2.jpg|vignette|L298P Shield V1.2]]&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, nous avons tenté de voir si l&#039;équilibre du robot était envisageable sans l&#039;emploi d&#039;une troisième roue. Plusieurs problèmes se sont alors posés : &lt;br /&gt;
&lt;br /&gt;
# La carte de puissance ne commandait qu&#039;un seul moteur&lt;br /&gt;
&lt;br /&gt;
# Le code dans la télécommande et le robot ne fonctionnaient pas&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Correction de la carte de puissance}}===&lt;br /&gt;
&lt;br /&gt;
Afin de vérifier si la carte alimentait convenablement le deuxième moteur, nous avons utilisé un voltmètre. Lors de son utilisation, la carte a cessé d&#039;alimenter le deuxième moteur, nous obligeant à changer la carte [https://www.dfrobot.com/wiki/index.php/Arduino_Motor_Shield_(L298N)_(SKU:DRI0009) L298N Shield] pour une [https://www.dfrobot.com/index.php?route=product/product&amp;amp;product_id=69 L298P Shield V1.2].&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Reprogrammation de la carte du robot}}===&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif ici est de programmer le robot de façon à vérifier si celui-ci est capable de tenir en équilibre ou non, et donc si l&#039;ajout d&#039;une troisième roue est nécessaire.&lt;br /&gt;
&lt;br /&gt;
{{Rouge|&amp;lt;b&amp;gt;Problème :&amp;lt;/b&amp;gt; Durant les tests du programme, une erreur de branchement (12V de la batterie connecté au 5V de l&#039;Arduino) a grillé un ATMEGA328P et l&#039;accéléromètre}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;&amp;lt;u&amp;gt;Code Robot&amp;lt;/u&amp;gt;&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#include &amp;quot;Wire.h&amp;quot;&lt;br /&gt;
#include &amp;quot;SPI.h&amp;quot;  &lt;br /&gt;
#include &amp;quot;Mirf.h&amp;quot;&lt;br /&gt;
#include &amp;quot;nRF24L01.h&amp;quot;&lt;br /&gt;
#include &amp;quot;MirfHardwareSpiDriver.h&amp;quot;&lt;br /&gt;
#include &amp;quot;I2Cdev.h&amp;quot;&lt;br /&gt;
#include &amp;quot;MPU6050.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
//Valeur limite de l&#039;accéléromètre&lt;br /&gt;
#define MAX_READ_ABS 16384&lt;br /&gt;
//Valeur limite des PWM (commande moteur)&lt;br /&gt;
#define MAX_WRITE_ABS 255&lt;br /&gt;
//Offset de l&#039;accéléromètre (valeur mesurée lorsque le robot est à l&#039;horizontal)&lt;br /&gt;
#define OFFSET -2000&lt;br /&gt;
&lt;br /&gt;
const double MAX_READ_NEG = (-MAX_READ_ABS+OFFSET/2.0); //Valeur maximale réelle négative (avec offset) =-17384&lt;br /&gt;
const double MAX_READ_POS = (MAX_READ_ABS+OFFSET/2.0); //Valeur maximale réelle positive (avec offset) =15384&lt;br /&gt;
&lt;br /&gt;
MPU6050 accelgyro;&lt;br /&gt;
int16_t ax, ay, az;&lt;br /&gt;
int16_t gx, gy, gz;&lt;br /&gt;
&lt;br /&gt;
long accelero;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  accelgyro.initialize();&lt;br /&gt;
  for(unsigned char i = 2 ; i &amp;lt;= 5 ; i++)&lt;br /&gt;
  {&lt;br /&gt;
    pinMode(i, OUTPUT);&lt;br /&gt;
  }&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
long getAccelero(long n = 100)&lt;br /&gt;
{&lt;br /&gt;
  long value = 0;&lt;br /&gt;
  for(long i = 0 ; i &amp;lt; n ; i++)&lt;br /&gt;
  {&lt;br /&gt;
    accelgyro.getMotion6(&amp;amp;ax, &amp;amp;ay, &amp;amp;az, &amp;amp;gx, &amp;amp;gy, &amp;amp;gz);&lt;br /&gt;
    value += ay;&lt;br /&gt;
  }  &lt;br /&gt;
  return value/n;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void arreter()&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(2, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void avancer(char n = 50)&lt;br /&gt;
{&lt;br /&gt;
  if(n == 0)&lt;br /&gt;
  {&lt;br /&gt;
    arreter();&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    analogWrite(3,(unsigned char)(MAX_WRITE_ABS - MAX_WRITE_ABS*(100-n)/200.0));&lt;br /&gt;
    analogWrite(5,(unsigned char)(MAX_WRITE_ABS - MAX_WRITE_ABS*(100-n)/200.0));&lt;br /&gt;
    digitalWrite(2,HIGH);&lt;br /&gt;
    digitalWrite(4,HIGH);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void reculer(char n = 50)&lt;br /&gt;
{&lt;br /&gt;
  if(n == 0)&lt;br /&gt;
  {&lt;br /&gt;
    arreter();&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    analogWrite(3,(unsigned char)(MAX_WRITE_ABS*(100-n)/200.0));&lt;br /&gt;
    analogWrite(5,(unsigned char)(MAX_WRITE_ABS*(100-n)/200.0));&lt;br /&gt;
    digitalWrite(2,HIGH);&lt;br /&gt;
    digitalWrite(4,HIGH);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void tourner(char n = 0)&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  bool _stop = 0;&lt;br /&gt;
  &lt;br /&gt;
  accelero = getAccelero(1);&lt;br /&gt;
  Serial.println(accelero);&lt;br /&gt;
  if(_stop)&lt;br /&gt;
  {&lt;br /&gt;
    if(accelero &amp;gt; 0.9*MAX_READ_POS || accelero &amp;lt; 0.9*MAX_READ_NEG)&lt;br /&gt;
    {&lt;br /&gt;
      arreter();&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
      if(accelero &amp;lt; OFFSET)&lt;br /&gt;
      {&lt;br /&gt;
        reculer(accelero/(0.9*MAX_READ_NEG)*100);&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        avancer(accelero/(0.9*MAX_READ_POS)*100);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    arreter();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#A000E0&amp;quot;&amp;gt;Limites&amp;lt;/span&amp;gt;====&lt;br /&gt;
* Les tests ont révélé une incompatibilité réactivité/pertinence. L&#039;accéléromètre donnant souvent des valeurs incohérentes, il était nécessaire d&#039;échantillonner ces valeurs. Plus l&#039;échantillon est important et moins le robot était réactif. Mais moins l&#039;échantillon est important, moins le robot se retrouve capable de réagir correctement (il accélère parfois dans le mauvais sens à cause d&#039;une valeur d&#039;accéléromètre erronée).&lt;br /&gt;
* Les moteurs ne réagissent pas assez rapidement à une commande, rendant l&#039;équilibre quasi-impossible.&lt;/div&gt;</summary>
		<author><name>Balancing</name></author>
	</entry>
	<entry>
		<id>https://wikigeii.iut-troyes.univ-reims.fr/index.php?title=Balancingbot&amp;diff=8917</id>
		<title>Balancingbot</title>
		<link rel="alternate" type="text/html" href="https://wikigeii.iut-troyes.univ-reims.fr/index.php?title=Balancingbot&amp;diff=8917"/>
		<updated>2017-01-10T11:25:06Z</updated>

		<summary type="html">&lt;p&gt;Balancing : Création du compte rendu Villette - Vin&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;={{Rouge|Projet 2016/2017 : Villette - Vin}}=&lt;br /&gt;
&lt;br /&gt;
=={{Vert|Tentative d&#039;équilibre dans deuxième roue}}==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:L298N_Shield.jpg|vignette|L298N Shield]]&lt;br /&gt;
[[Fichier:L298P_Shield_V1dot2.jpg|vignette|L298P Shield V1.2]]&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, nous avons tenté de voir si l&#039;équilibre du robot était envisageable sans l&#039;emploi d&#039;une troisième roue. Plusieurs problèmes se sont alors posés : &lt;br /&gt;
&lt;br /&gt;
# La carte de puissance ne commandait qu&#039;un seul moteur&lt;br /&gt;
&lt;br /&gt;
# Le code dans la télécommande et le robot ne fonctionnaient pas&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Correction de la carte de puissance}}===&lt;br /&gt;
&lt;br /&gt;
Afin de vérifier si la carte alimentait convenablement le deuxième moteur, nous avons utilisé un voltmètre. Lors de son utilisation, la carte a cessé d&#039;alimenter le deuxième moteur, nous obligeant à changer la carte [https://www.dfrobot.com/wiki/index.php/Arduino_Motor_Shield_(L298N)_(SKU:DRI0009) L298N Shield] pour une [https://www.dfrobot.com/index.php?route=product/product&amp;amp;product_id=69 L298P Shield V1.2].&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Reprogrammation des deux cartes}}===&lt;br /&gt;
&lt;br /&gt;
{{Rouge|&amp;lt;b&amp;gt;Problème :&amp;lt;/b&amp;gt; Durant les tests du programme, une erreur de branchement a grillé un ATMEGA328P et l&#039;accéléromètre}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;&amp;lt;u&amp;gt;Code Robot&amp;lt;/u&amp;gt;&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#include &amp;quot;Wire.h&amp;quot;&lt;br /&gt;
#include &amp;quot;SPI.h&amp;quot;  &lt;br /&gt;
#include &amp;quot;Mirf.h&amp;quot;&lt;br /&gt;
#include &amp;quot;nRF24L01.h&amp;quot;&lt;br /&gt;
#include &amp;quot;MirfHardwareSpiDriver.h&amp;quot;&lt;br /&gt;
#include &amp;quot;I2Cdev.h&amp;quot;&lt;br /&gt;
#include &amp;quot;MPU6050.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
//Valeur limite de l&#039;accéléromètre&lt;br /&gt;
#define MAX_READ_ABS 16384&lt;br /&gt;
//Valeur limite des PWM (commande moteur)&lt;br /&gt;
#define MAX_WRITE_ABS 255&lt;br /&gt;
//Offset de l&#039;accéléromètre (valeur mesurée lorsque le robot est à l&#039;horizontal)&lt;br /&gt;
#define OFFSET -2000&lt;br /&gt;
&lt;br /&gt;
const double MAX_READ_NEG = (-MAX_READ_ABS+OFFSET/2.0); //Valeur maximale réelle négative (avec offset) =-17384&lt;br /&gt;
const double MAX_READ_POS = (MAX_READ_ABS+OFFSET/2.0); //Valeur maximale réelle positive (avec offset) =15384&lt;br /&gt;
&lt;br /&gt;
MPU6050 accelgyro;&lt;br /&gt;
int16_t ax, ay, az;&lt;br /&gt;
int16_t gx, gy, gz;&lt;br /&gt;
&lt;br /&gt;
long accelero;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  accelgyro.initialize();&lt;br /&gt;
  for(unsigned char i = 2 ; i &amp;lt;= 5 ; i++)&lt;br /&gt;
  {&lt;br /&gt;
    pinMode(i, OUTPUT);&lt;br /&gt;
  }&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
long getAccelero(long n = 100)&lt;br /&gt;
{&lt;br /&gt;
  long value = 0;&lt;br /&gt;
  for(long i = 0 ; i &amp;lt; n ; i++)&lt;br /&gt;
  {&lt;br /&gt;
    accelgyro.getMotion6(&amp;amp;ax, &amp;amp;ay, &amp;amp;az, &amp;amp;gx, &amp;amp;gy, &amp;amp;gz);&lt;br /&gt;
    value += ay;&lt;br /&gt;
  }  &lt;br /&gt;
  return value/n;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void arreter()&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(2, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void avancer(char n = 50)&lt;br /&gt;
{&lt;br /&gt;
  if(n == 0)&lt;br /&gt;
  {&lt;br /&gt;
    arreter();&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    analogWrite(3,(unsigned char)(MAX_WRITE_ABS - MAX_WRITE_ABS*(100-n)/200.0));&lt;br /&gt;
    analogWrite(5,(unsigned char)(MAX_WRITE_ABS - MAX_WRITE_ABS*(100-n)/200.0));&lt;br /&gt;
    digitalWrite(2,HIGH);&lt;br /&gt;
    digitalWrite(4,HIGH);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void reculer(char n = 50)&lt;br /&gt;
{&lt;br /&gt;
  if(n == 0)&lt;br /&gt;
  {&lt;br /&gt;
    arreter();&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    analogWrite(3,(unsigned char)(MAX_WRITE_ABS*(100-n)/200.0));&lt;br /&gt;
    analogWrite(5,(unsigned char)(MAX_WRITE_ABS*(100-n)/200.0));&lt;br /&gt;
    digitalWrite(2,HIGH);&lt;br /&gt;
    digitalWrite(4,HIGH);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void tourner(char n = 0)&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  bool _stop = 0;&lt;br /&gt;
  &lt;br /&gt;
  accelero = getAccelero(1);&lt;br /&gt;
  Serial.println(accelero);&lt;br /&gt;
  if(_stop)&lt;br /&gt;
  {&lt;br /&gt;
    if(accelero &amp;gt; 0.9*MAX_READ_POS || accelero &amp;lt; 0.9*MAX_READ_NEG)&lt;br /&gt;
    {&lt;br /&gt;
      arreter();&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
      if(accelero &amp;lt; OFFSET)&lt;br /&gt;
      {&lt;br /&gt;
        reculer(accelero/(0.9*MAX_READ_NEG)*100);&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        avancer(accelero/(0.9*MAX_READ_POS)*100);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    arreter();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#A000E0&amp;quot;&amp;gt;Limites&amp;lt;/span&amp;gt;====&lt;br /&gt;
* Les tests ont révélé une incompatibilité réactivité/pertinence. L&#039;accéléromètre donnant souvent des valeurs incohérentes, il était nécessaire d&#039;échantillonner ces valeurs. Plus l&#039;échantillon est important et moins le robot était réactif. Mais moins l&#039;échantillon est important, moins le robot se retrouve capable de réagir correctement (il accélère parfois dans le mauvais sens à cause d&#039;une valeur d&#039;accéléromètre erronée).&lt;br /&gt;
* Les moteurs ne réagissent pas assez rapidement à une commande, rendant l&#039;équilibre quasi-impossible.&lt;/div&gt;</summary>
		<author><name>Balancing</name></author>
	</entry>
	<entry>
		<id>https://wikigeii.iut-troyes.univ-reims.fr/index.php?title=Fichier:L298P_Shield_V1dot2.jpg&amp;diff=8913</id>
		<title>Fichier:L298P Shield V1dot2.jpg</title>
		<link rel="alternate" type="text/html" href="https://wikigeii.iut-troyes.univ-reims.fr/index.php?title=Fichier:L298P_Shield_V1dot2.jpg&amp;diff=8913"/>
		<updated>2017-01-10T10:26:42Z</updated>

		<summary type="html">&lt;p&gt;Balancing : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Balancing</name></author>
	</entry>
	<entry>
		<id>https://wikigeii.iut-troyes.univ-reims.fr/index.php?title=Fichier:L298N_Shield.jpg&amp;diff=8912</id>
		<title>Fichier:L298N Shield.jpg</title>
		<link rel="alternate" type="text/html" href="https://wikigeii.iut-troyes.univ-reims.fr/index.php?title=Fichier:L298N_Shield.jpg&amp;diff=8912"/>
		<updated>2017-01-10T10:26:06Z</updated>

		<summary type="html">&lt;p&gt;Balancing : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Balancing</name></author>
	</entry>
	<entry>
		<id>https://wikigeii.iut-troyes.univ-reims.fr/index.php?title=Balancingbot&amp;diff=8908</id>
		<title>Balancingbot</title>
		<link rel="alternate" type="text/html" href="https://wikigeii.iut-troyes.univ-reims.fr/index.php?title=Balancingbot&amp;diff=8908"/>
		<updated>2017-01-10T10:03:12Z</updated>

		<summary type="html">&lt;p&gt;Balancing : Changement des couleurs&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
={{Rouge|Projet 2016/2017 : Villette - Vin}}=&lt;br /&gt;
&lt;br /&gt;
=={{Vert|Tentative d&#039;équilibre dans deuxième roue}}==&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, nous avons tenté de voir si l&#039;équilibre du robot était envisageable sans l&#039;emploi d&#039;une troisième roue. Plusieurs problèmes se sont alors posés : &lt;br /&gt;
&lt;br /&gt;
# La carte de puissance ne commandait qu&#039;un seul moteur&lt;br /&gt;
&lt;br /&gt;
# Le code dans la télécommande et le robot ne fonctionnait pas&lt;br /&gt;
&lt;br /&gt;
==={{Bleu|Correction de la carte de puissance}}===&lt;br /&gt;
&lt;br /&gt;
Afin de vérifier si la carte alimentait convenablement le deuxième moteur, nous avons utilisé un voltmètre. Lors de son utilisation, la carte a cessé d&#039;alimenter le deuxième moteur, nous obligeant à changer la carte [https://www.dfrobot.com/wiki/index.php/Arduino_Motor_Shield_(L298N)_(SKU:DRI0009) L298N Shield] pour une [https://www.dfrobot.com/index.php?route=product/product&amp;amp;product_id=69 L298P Shield V1.2].&lt;br /&gt;
&lt;br /&gt;
Code non-fonctionnel&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#include &amp;quot;Wire.h&amp;quot;&lt;br /&gt;
#include &amp;quot;SPI.h&amp;quot;  &lt;br /&gt;
#include &amp;quot;Mirf.h&amp;quot;&lt;br /&gt;
#include &amp;quot;nRF24L01.h&amp;quot;&lt;br /&gt;
#include &amp;quot;MirfHardwareSpiDriver.h&amp;quot;&lt;br /&gt;
#include &amp;quot;I2Cdev.h&amp;quot;&lt;br /&gt;
#include &amp;quot;MPU6050.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#define MAX_READ_ABS 16384&lt;br /&gt;
#define MAX_WRITE_ABS 255&lt;br /&gt;
#define OFFSET -2000&lt;br /&gt;
&lt;br /&gt;
const double MAX_READ_NEG = (-MAX_READ_ABS+OFFSET/2.0);&lt;br /&gt;
const double MAX_READ_POS = (MAX_READ_ABS+OFFSET/2.0);&lt;br /&gt;
&lt;br /&gt;
MPU6050 accelgyro;&lt;br /&gt;
int16_t ax, ay, az;&lt;br /&gt;
int16_t gx, gy, gz;&lt;br /&gt;
&lt;br /&gt;
long accelero;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  accelgyro.initialize();&lt;br /&gt;
  for(unsigned char i = 2 ; i &amp;lt;= 5 ; i++)&lt;br /&gt;
  {&lt;br /&gt;
    pinMode(i, OUTPUT);&lt;br /&gt;
  }&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
long getAccelero(long n = 100)&lt;br /&gt;
{&lt;br /&gt;
  long value = 0;&lt;br /&gt;
  for(long i = 0 ; i &amp;lt; n ; i++)&lt;br /&gt;
  {&lt;br /&gt;
    accelgyro.getMotion6(&amp;amp;ax, &amp;amp;ay, &amp;amp;az, &amp;amp;gx, &amp;amp;gy, &amp;amp;gz);&lt;br /&gt;
    value += ay;&lt;br /&gt;
  }  &lt;br /&gt;
  return value/n;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void arreter()&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(2, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void avancer(char n = 50)&lt;br /&gt;
{&lt;br /&gt;
  if(n == 0)&lt;br /&gt;
  {&lt;br /&gt;
    arreter();&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    analogWrite(3,(unsigned char)(MAX_WRITE_ABS - MAX_WRITE_ABS*(100-n)/200.0));&lt;br /&gt;
    analogWrite(5,(unsigned char)(MAX_WRITE_ABS - MAX_WRITE_ABS*(100-n)/200.0));&lt;br /&gt;
    digitalWrite(2,HIGH);&lt;br /&gt;
    digitalWrite(4,HIGH);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void reculer(char n = 50)&lt;br /&gt;
{&lt;br /&gt;
  if(n == 0)&lt;br /&gt;
  {&lt;br /&gt;
    arreter();&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    analogWrite(3,(unsigned char)(MAX_WRITE_ABS*(100-n)/200.0));&lt;br /&gt;
    analogWrite(5,(unsigned char)(MAX_WRITE_ABS*(100-n)/200.0));&lt;br /&gt;
    digitalWrite(2,HIGH);&lt;br /&gt;
    digitalWrite(4,HIGH);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void tourner(char n = 0)&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  bool _stop = 0;&lt;br /&gt;
  &lt;br /&gt;
  accelero = getAccelero(1);&lt;br /&gt;
  Serial.println(accelero);&lt;br /&gt;
  if(_stop)&lt;br /&gt;
  {&lt;br /&gt;
    if(accelero &amp;gt; 0.9*MAX_READ_POS || accelero &amp;lt; 0.9*MAX_READ_NEG)&lt;br /&gt;
    {&lt;br /&gt;
      arreter();&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
      if(accelero &amp;lt; OFFSET)&lt;br /&gt;
      {&lt;br /&gt;
        reculer(accelero/(0.9*MAX_READ_NEG)*100);&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        avancer(accelero/(0.9*MAX_READ_POS)*100);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    arreter();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Balancing</name></author>
	</entry>
	<entry>
		<id>https://wikigeii.iut-troyes.univ-reims.fr/index.php?title=Balancingbot&amp;diff=8907</id>
		<title>Balancingbot</title>
		<link rel="alternate" type="text/html" href="https://wikigeii.iut-troyes.univ-reims.fr/index.php?title=Balancingbot&amp;diff=8907"/>
		<updated>2017-01-10T10:02:14Z</updated>

		<summary type="html">&lt;p&gt;Balancing : Création du compte rendu Villette - Vin&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
=Projet 2016/2017 : Villette - Vin=&lt;br /&gt;
&lt;br /&gt;
=={{Rouge|Tentative d&#039;équilibre dans deuxième roue}}==&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, nous avons tenté de voir si l&#039;équilibre du robot était envisageable sans l&#039;emploi d&#039;une troisième roue. Plusieurs problèmes se sont alors posés : &lt;br /&gt;
&lt;br /&gt;
# La carte de puissance ne commandait qu&#039;un seul moteur&lt;br /&gt;
&lt;br /&gt;
# Le code dans la télécommande et le robot ne fonctionnait pas&lt;br /&gt;
&lt;br /&gt;
==={{Vert|Correction de la carte de puissance}}===&lt;br /&gt;
&lt;br /&gt;
Afin de vérifier si la carte alimentait convenablement le deuxième moteur, nous avons utilisé un voltmètre. Lors de son utilisation, la carte a cessé d&#039;alimenter le deuxième moteur, nous obligeant à changer la carte [https://www.dfrobot.com/wiki/index.php/Arduino_Motor_Shield_(L298N)_(SKU:DRI0009) L298N Shield] pour une [https://www.dfrobot.com/index.php?route=product/product&amp;amp;product_id=69 L298P Shield V1.2].&lt;br /&gt;
&lt;br /&gt;
Code non-fonctionnel&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#include &amp;quot;Wire.h&amp;quot;&lt;br /&gt;
#include &amp;quot;SPI.h&amp;quot;  &lt;br /&gt;
#include &amp;quot;Mirf.h&amp;quot;&lt;br /&gt;
#include &amp;quot;nRF24L01.h&amp;quot;&lt;br /&gt;
#include &amp;quot;MirfHardwareSpiDriver.h&amp;quot;&lt;br /&gt;
#include &amp;quot;I2Cdev.h&amp;quot;&lt;br /&gt;
#include &amp;quot;MPU6050.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#define MAX_READ_ABS 16384&lt;br /&gt;
#define MAX_WRITE_ABS 255&lt;br /&gt;
#define OFFSET -2000&lt;br /&gt;
&lt;br /&gt;
const double MAX_READ_NEG = (-MAX_READ_ABS+OFFSET/2.0);&lt;br /&gt;
const double MAX_READ_POS = (MAX_READ_ABS+OFFSET/2.0);&lt;br /&gt;
&lt;br /&gt;
MPU6050 accelgyro;&lt;br /&gt;
int16_t ax, ay, az;&lt;br /&gt;
int16_t gx, gy, gz;&lt;br /&gt;
&lt;br /&gt;
long accelero;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  accelgyro.initialize();&lt;br /&gt;
  for(unsigned char i = 2 ; i &amp;lt;= 5 ; i++)&lt;br /&gt;
  {&lt;br /&gt;
    pinMode(i, OUTPUT);&lt;br /&gt;
  }&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
long getAccelero(long n = 100)&lt;br /&gt;
{&lt;br /&gt;
  long value = 0;&lt;br /&gt;
  for(long i = 0 ; i &amp;lt; n ; i++)&lt;br /&gt;
  {&lt;br /&gt;
    accelgyro.getMotion6(&amp;amp;ax, &amp;amp;ay, &amp;amp;az, &amp;amp;gx, &amp;amp;gy, &amp;amp;gz);&lt;br /&gt;
    value += ay;&lt;br /&gt;
  }  &lt;br /&gt;
  return value/n;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void arreter()&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(2, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void avancer(char n = 50)&lt;br /&gt;
{&lt;br /&gt;
  if(n == 0)&lt;br /&gt;
  {&lt;br /&gt;
    arreter();&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    analogWrite(3,(unsigned char)(MAX_WRITE_ABS - MAX_WRITE_ABS*(100-n)/200.0));&lt;br /&gt;
    analogWrite(5,(unsigned char)(MAX_WRITE_ABS - MAX_WRITE_ABS*(100-n)/200.0));&lt;br /&gt;
    digitalWrite(2,HIGH);&lt;br /&gt;
    digitalWrite(4,HIGH);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void reculer(char n = 50)&lt;br /&gt;
{&lt;br /&gt;
  if(n == 0)&lt;br /&gt;
  {&lt;br /&gt;
    arreter();&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    analogWrite(3,(unsigned char)(MAX_WRITE_ABS*(100-n)/200.0));&lt;br /&gt;
    analogWrite(5,(unsigned char)(MAX_WRITE_ABS*(100-n)/200.0));&lt;br /&gt;
    digitalWrite(2,HIGH);&lt;br /&gt;
    digitalWrite(4,HIGH);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void tourner(char n = 0)&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  bool _stop = 0;&lt;br /&gt;
  &lt;br /&gt;
  accelero = getAccelero(1);&lt;br /&gt;
  Serial.println(accelero);&lt;br /&gt;
  if(_stop)&lt;br /&gt;
  {&lt;br /&gt;
    if(accelero &amp;gt; 0.9*MAX_READ_POS || accelero &amp;lt; 0.9*MAX_READ_NEG)&lt;br /&gt;
    {&lt;br /&gt;
      arreter();&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
      if(accelero &amp;lt; OFFSET)&lt;br /&gt;
      {&lt;br /&gt;
        reculer(accelero/(0.9*MAX_READ_NEG)*100);&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        avancer(accelero/(0.9*MAX_READ_POS)*100);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    arreter();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Balancing</name></author>
	</entry>
	<entry>
		<id>https://wikigeii.iut-troyes.univ-reims.fr/index.php?title=Balancingbot&amp;diff=8895</id>
		<title>Balancingbot</title>
		<link rel="alternate" type="text/html" href="https://wikigeii.iut-troyes.univ-reims.fr/index.php?title=Balancingbot&amp;diff=8895"/>
		<updated>2017-01-06T10:17:09Z</updated>

		<summary type="html">&lt;p&gt;Balancing : Ajout d&amp;#039;un code&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
={{Rouge|Premiere partie}}=&lt;br /&gt;
&lt;br /&gt;
Code non-fonctionnel&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#include &amp;quot;Wire.h&amp;quot;&lt;br /&gt;
#include &amp;quot;SPI.h&amp;quot;  &lt;br /&gt;
#include &amp;quot;Mirf.h&amp;quot;&lt;br /&gt;
#include &amp;quot;nRF24L01.h&amp;quot;&lt;br /&gt;
#include &amp;quot;MirfHardwareSpiDriver.h&amp;quot;&lt;br /&gt;
#include &amp;quot;I2Cdev.h&amp;quot;&lt;br /&gt;
#include &amp;quot;MPU6050.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#define MAX_READ_ABS 16384&lt;br /&gt;
#define MAX_WRITE_ABS 255&lt;br /&gt;
#define OFFSET -2000&lt;br /&gt;
&lt;br /&gt;
const double MAX_READ_NEG = (-MAX_READ_ABS+OFFSET/2.0);&lt;br /&gt;
const double MAX_READ_POS = (MAX_READ_ABS+OFFSET/2.0);&lt;br /&gt;
&lt;br /&gt;
MPU6050 accelgyro;&lt;br /&gt;
int16_t ax, ay, az;&lt;br /&gt;
int16_t gx, gy, gz;&lt;br /&gt;
&lt;br /&gt;
long accelero;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  accelgyro.initialize();&lt;br /&gt;
  for(unsigned char i = 2 ; i &amp;lt;= 5 ; i++)&lt;br /&gt;
  {&lt;br /&gt;
    pinMode(i, OUTPUT);&lt;br /&gt;
  }&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
long getAccelero(long n = 100)&lt;br /&gt;
{&lt;br /&gt;
  long value = 0;&lt;br /&gt;
  for(long i = 0 ; i &amp;lt; n ; i++)&lt;br /&gt;
  {&lt;br /&gt;
    accelgyro.getMotion6(&amp;amp;ax, &amp;amp;ay, &amp;amp;az, &amp;amp;gx, &amp;amp;gy, &amp;amp;gz);&lt;br /&gt;
    value += ay;&lt;br /&gt;
  }  &lt;br /&gt;
  return value/n;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void arreter()&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(2, LOW);&lt;br /&gt;
  digitalWrite(4, LOW);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void avancer(char n = 50)&lt;br /&gt;
{&lt;br /&gt;
  if(n == 0)&lt;br /&gt;
  {&lt;br /&gt;
    arreter();&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    analogWrite(3,(unsigned char)(MAX_WRITE_ABS - MAX_WRITE_ABS*(100-n)/200.0));&lt;br /&gt;
    analogWrite(5,(unsigned char)(MAX_WRITE_ABS - MAX_WRITE_ABS*(100-n)/200.0));&lt;br /&gt;
    digitalWrite(2,HIGH);&lt;br /&gt;
    digitalWrite(4,HIGH);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void reculer(char n = 50)&lt;br /&gt;
{&lt;br /&gt;
  if(n == 0)&lt;br /&gt;
  {&lt;br /&gt;
    arreter();&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    analogWrite(3,(unsigned char)(MAX_WRITE_ABS*(100-n)/200.0));&lt;br /&gt;
    analogWrite(5,(unsigned char)(MAX_WRITE_ABS*(100-n)/200.0));&lt;br /&gt;
    digitalWrite(2,HIGH);&lt;br /&gt;
    digitalWrite(4,HIGH);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void tourner(char n = 0)&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  bool _stop = 0;&lt;br /&gt;
  &lt;br /&gt;
  accelero = getAccelero(1);&lt;br /&gt;
  Serial.println(accelero);&lt;br /&gt;
  if(_stop)&lt;br /&gt;
  {&lt;br /&gt;
    if(accelero &amp;gt; 0.9*MAX_READ_POS || accelero &amp;lt; 0.9*MAX_READ_NEG)&lt;br /&gt;
    {&lt;br /&gt;
      arreter();&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
      if(accelero &amp;lt; OFFSET)&lt;br /&gt;
      {&lt;br /&gt;
        reculer(accelero/(0.9*MAX_READ_NEG)*100);&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        avancer(accelero/(0.9*MAX_READ_POS)*100);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    arreter();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Balancing</name></author>
	</entry>
</feed>