site-tpe/index/includes/ex2-full.php
2025-05-16 18:49:08 +02:00

376 lines
No EOL
12 KiB
PHP

<div id="ex2d">
<h3>Fonctionnement</h3>
<p>Le robot est compos&eacute; de plusieurs &eacute;l&eacute;ments pour mod&eacute;lier la chauve - souris :</p>
<ul>
<li>Le module &agrave; ultrasons et son servo-moteur mod&eacute;lise les cordes vocales et les oreilles de la chauve-souris.</li>
<li>Les moteurs et roues mod&eacute;lisent le moyen de d&eacute;placement de la chauve-souris.</li>
<li>La carte arduino commande tous les &eacute;l&eacute;ments, elle mod&eacute;lise le cerveau de la chauve-souris.</li>
<li>Le chassis contient tous les composants.</li>
</ul>
<h3 id="composants">Composants</h3>
<h4>Le module &agrave; ultrasons</h4>
<p>Le module HC-SR04 permet d&rsquo;&eacute;valuer les distances entre un objet mobile et les obstacles rencontr&eacute;s. Il &eacute;met des ultrasons puis les capte apr&egrave;s un &eacute;cho gr&acirc;ce &agrave; ses &eacute;metteur et r&eacute;cepteur. Il est con&ccedil;u pour fonctionner simplement avec une carte arduino.</p>
<figure style="width: 350px;"><img alt="Module HC-SR04" src="https://www.bananarobotics.com/shop/image/cache/data/sku/BR/0/1/0/0/2/BR010020-HC-SR04-Ultrasonic-Distance-Sensor-Module/HC-SR04-Ultrasonic-Distance-Sensor-Module-600x600.png" />
<figcaption>
<p>Module HC-SR04</p>
<a href="https://www.bananarobotics.com/shop">Source de l&#39;image</a></figcaption>
</figure>
<h4>Le servo-moteur</h4>
<p>Le servo-moteur est un moteur &eacute;lectrique auquel on a ajouter un syst&egrave;me lui permettant d&#39;avoir une grande pr&eacute;cision lors de sa rotation. Il permet de contr&ocirc;ler avec pr&eacute;cision la direction du module &agrave; utrasons. Ainsi, le champ de vision du module est augment&eacute; gr&acirc;ce &agrave; un mouvement de balayage.</p>
<figure style="width: 350px;"><img alt="Servo-moteur" src="http://img.banggood.com/thumb/large/upload/2015/06/SKU250601-1.jpg" />
<figcaption>
<p>Servo moteur</p>
<a href="http://www.banggood.com/TowerPro-SG90-Mini-Micro-Digital-Servo-9g-For-RC-Models-p-984114.html">Source</a></figcaption>
</figure>
<h4>Les moteurs</h4>
<h4>La carte arduino</h4>
<p>Une carte Arduino est un circuit imprim&eacute; en mat&eacute;riel libre sur lequel se trouve un microcontr&ocirc;leur. Il permet de traiter les informations collect&eacute;es par les diff&eacute;rents ports d&#39;entr&eacute;s de la carte, et de r&eacute;agir en cons&eacute;quence &agrave; travers les ports de sortie. On peut ainsi contr&ocirc;ler certains composants, ainsi qu&#39;une vari&eacute;t&eacute; de p&eacute;riph&eacute;riques sp&eacute;cialement con&ccedil;us pour lui. Il fonctionne gr&acirc;ce &agrave; du code du language C qui permet de r&eacute;aliser des actions sp&eacute;cialement command&eacute;es.</p>
<figure style="width: 350px;"><img alt="Carte arduino UNO" src="http://www.innofab.fr/wp-content/uploads/2015/08/ARDUINO_R3.png" />
<figcaption>
<p>Carte Arduino UNO</p>
<a href="http://www.innofab.fr/wp-content/uploads/2015/08/ARDUINO_R3.png">Source de l&#39;image</a></figcaption>
</figure>
<h4>Le chassis</h4>
<p>Le chassis a pour fonction de relier tous les composants entre eux et faciliter le montage et la conception du robot. C&#39;est un kit pour robot arduino, mais ne fournit pas de code ou de carte.</p>
<figure style="width: 350px;"><img alt="Le chassis" src="http://img.banggood.com/thumb/large/oaupload/banggood/images/F2/51/c24768b7-3305-49b4-bbd6-64cf7b6107f0.jpg" />
<figcaption>
<p>Le chassis</p>
<a href="http://www.banggood.com/2WD-Smart-Car-Chassis-Tracing-Car-With-Encoder-Battery-Box-For-Arduino-p-906309.html">Source de l&#39;image</a></figcaption>
</figure>
<h4>Les batteries</h4>
<p>Les batteries ont pour fonction d&#39;alimenter le robot en &eacute;lectricit&eacute;</p>
<figure style="width: 350px;"><img alt="La batterie 1" src="http://www.batteryspace.com/images/products/detail/5830.png" /><img alt="La batterie 2" src="https://chioszrobots.files.wordpress.com/2014/04/battery-holder-4aa-chiosz-robots.png?w=593" />
<figcaption>
<p>Les batteries</p>
<a href="http://www.banggood.com/2WD-Smart-Car-Chassis-Tracing-Car-With-Encoder-Battery-Box-For-Arduino-p-906309.html">Source de l&#39;image</a></figcaption>
</figure>
<h3>Construction</h3>
<p>La contruction du robot a &eacute;t&eacute; tr&egrave;s complexe, mais nous a appris beaucoup &agrave; propos de l&#39;&eacute;lectronique,</p>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam et tellus et tellus euismod congue. Praesent diam ante, pellentesque lacinia vestibulum eget, iaculis eget est. Nullam justo dui, hendrerit eu nulla nec, aliquam posuere libero. Quisque ut ornare nisi, eu gravida sem. Maecenas et lacus sit amet quam maximus aliquet. Suspendisse sodales sapien sit amet arcu efficitur, vel rutrum mi aliquet. Cras mollis facilisis metus id bibendum. Ut vel diam pulvinar, lobortis diam non, placerat tellus. Morbi lacus velit, egestas id elit sit amet, dapibus accumsan justo. Nulla facilisi. Proin vestibulum neque condimentum urna molestie aliquet. Nunc fermentum suscipit libero, ac maximus diam scelerisque vitae. Integer sed auctor magna. Aliquam erat volutpat.</p>
<h3>Logiciel</h3>
<p>On utilise pour cont&ocirc;ler les composants p&eacute;riph&eacute;riques la carte Arduino. Celle-ci comporte des ports gr&acirc;ce auquels elle communique avec ses p&eacute;riph&eacute;riques. Les ports n&#39;ont pas tous les m&ecirc;mes propri&eacute;t&eacute;s, c&#39;est pourquoi il faut d&eacute;cider quels port sera responsable de quelle t&acirc;che. Faire un plan aide aussi &eacute;norm&eacute;ment lors du montage &eacute;lectrique du robot : deux fils sont vite &eacute;chang&eacute;s, et retrouver une erreur est une t&acirc;che difficile qui fait perdre beaucoup de temps. Une carte arduino standart comporte 13 ports qui ne seront utiles.</p>
<h3>Plan des ports Entr&eacute;e/Sortie</h3>
<h4>Ports I/O (= Input/Output, c&#39;est &agrave; dire Entr&eacute;e/Sortie)</h4>
<p>Ports 2, 4, 7, 8 et 13</p>
<h4>Ports I/O capables de MLI (Modulation de la largeur d&#39;impulsion)</h4>
<p>Port 3, 5, 6, 9, 10 et 11</p>
<p>La Modulation de la largeur d&#39;impulsion (MLI ; en anglais : Pulse Width Modulation, soit PWM) est une technique couramment utilis&eacute;e pour synth&eacute;tiser des signaux continus (analogues) &agrave; l&#39;aide de circuits &agrave; fonctionnement tout ou rien (num&eacute;riques). Cela permet de cont&ocirc;ler de fa&ccedil;on analogique (c&#39;est &agrave; dire que le signal peut &ecirc;tre de plusieurs valeurs d&#39;intensit&eacute;) avec un contr&ocirc;leur num&eacute;rique qui ne peut avoir que deux signaux : allum&eacute; ou &eacute;teint)</p>
<figure style="width: 350px;"><img alt="PWM" src="https://upload.wikimedia.org/wikipedia/commons/thumb/e/e2/Delta_PWM.png/320px-Delta_PWM.png" />
<figcaption>
<p>Exemple de synth&egrave;se d&#39;un signal gr&acirc;ce &agrave; la MLI</p>
</figcaption>
</figure>
<table>
<caption>Plan des ports utilis&eacute;s, et leur fonction (Entr&eacute;e ou sortie)</caption>
<tbody>
<tr>
<th>Port</th>
<th>Entr&eacute;e ou sortie</th>
<th>Fonction</th>
</tr>
<tr>
<td>2</td>
<td>Entr&eacute;e</td>
<td>Indication de la position de la roue droite</td>
</tr>
<tr>
<td>4</td>
<td>Entr&eacute;e</td>
<td>Indication de la position de la roue gauche</td>
</tr>
<tr>
<td>7</td>
<td>Entr&eacute;e</td>
<td>Signal du module HC-SR04</td>
</tr>
<tr>
<td>3</td>
<td>Sortie</td>
<td>Contr&ocirc;le de la vitesse de la roue droite</td>
</tr>
<tr>
<td>5</td>
<td>Sortie</td>
<td>Contr&ocirc;le de la vitesse de la roue gauche</td>
</tr>
<tr>
<td>8</td>
<td>Sortie</td>
<td>Contr&ocirc;le de la position du servo-moteur</td>
</tr>
<tr>
<td>12</td>
<td>Sortie</td>
<td>Envoi du signal pour le module HC-SR04</td>
</tr>
</tbody>
</table>
<h3 id="code">Le code de la carte arduino</h3>
<p>&nbsp;Il faut programmer la carte avec du code C pour lui dire quoi faire.</p>
<p>Les diff&eacute;rentes actions &agrave; r&eacute;aliser sont list&eacute;es ci-dessous :</p>
<ul>
<li>Cont&ocirc;ler les moteurs des roues pour se faire d&eacute;placer le robot
<ul>
<li>Tout droit</li>
<li>A gauche</li>
<li>A droite</li>
</ul>
</li>
<li>Orienter le module &agrave; ultrasons dans la direction souhait&eacute;e gr&acirc;ce au servo-moteur</li>
<li>Contr&ocirc;ler le module &agrave; ultrasons et ainsi conna&icirc;tre la position d&#39;&eacute;ventuels obstacles</li>
<li>Analyser les donn&eacute;es et r&eacute;agir en cons&eacute;quence</li>
</ul>
<p>A chaque t&acirc;che est d&eacute;di&eacute;e une portion du code, qui est au final compact&eacute; en un seul document, envoy&eacute; &agrave; la carte Arduino.</p>
<h3>Code du module &agrave; ultrasons HC-SR04&nbsp;(source : <a href="http://howtomechatronics.com/tutorials/arduino/ultrasonic-sensor-hc-sr04/" style="display: inline;">HowToMechatronics.com</a>) -<button id="HC-SR04" onclick="showButton('HC-SR04')" value="Afficher">Afficher</button></h3>
<div id="HC-SR04d" style="display: none;">
<pre data-enlighter-language="c">
/*
* Ultrasonic Sensor HC-SR04 and Arduino Tutorial
*
* Crated by Dejan Nedelkovski,
* www.HowToMechatronics.com
*
*/
// defines pins numbers
const int trigPin = 9;
const int echoPin = 10;
// defines variables
long duration;
int distance;
void setup() {
pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output
pinMode(echoPin, INPUT); // Sets the echoPin as an Input
Serial.begin(9600); // Starts the serial communication
}
void loop() {
// Clears the trigPin
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
// Sets the trigPin on HIGH state for 10 micro seconds
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// Reads the echoPin, returns the sound wave travel time in microseconds
duration = pulseIn(echoPin, HIGH);
// Calculating the distance
distance= duration*0.034/2;
// Prints the distance on the Serial Monitor
Serial.print(&quot;Distance: &quot;);
Serial.println(distance);
}
</pre>
</div>
<h3>Code de contr&ocirc;le des roues -<button id="roues" onclick="showButton('roues')" value="Afficher">Afficher</button></h3>
<div id="rouesd" style="display: none;">
<pre data-enlighter-language="c">
/*Vide pour l&#39;instant*/
</pre>
</div>
<h3>Code de contr&ocirc;le du servo -<button id="servo" onclick="showButton('servo')" value="Afficher">Afficher</button></h3>
<div id="servod" style="display: none;">
<pre data-enlighter-language="c">
/*Vide pour l&#39;instant*/
</pre>
</div>
<h3>Code complet de l&#39;arduino du robot -<button id="robot" onclick="showButton('robot')" value="Afficher">Afficher</button></h3>
<div id="robotd" style="display: none;">
<pre data-enlighter-language="c">
/*
INCREMENTATION
for (i = 0; i &lt; 5; i++){
}
Ce qu&#39;il reste &agrave; faire :
testDevant
demiTour
tirageSort
avancer
*/
int libreDevant;
int posServo;
int resulTirage;
int nbDeg;
int verifOpp;
int distMinLibre;
int dist;
int testDevant(){
//prendre la donn&eacute;e du capteur
if(dist &gt;= distMinLibre)
{
libreDevant = 1;
}
else
{
libreDevant = 0;
//Canard
}
return libreDevant;
}
int tirageSort(){
return resulTirage;
}
int checkG(){
posServo = posServo + nbDeg; //tourner le capteur
libreDevant = testDevant();
//V&eacute;rifier si c&#39;est libre devant
if (libreDevant == 1)
{
posServo = 90; //remettre le servo au milieu
}
else
{
if (posServo == 180) //on arrive en fin de course
{
posServo = 90;
if(verifOpp = 0)
{
checkD()
}
else
{
verifOpp = 0;
demiTour()
}
}
else if(posServo &lt; 180) //On v&eacute;rifie de l&#39;autre c&ocirc;t&eacute;
{
checkG()
}
}
}
int checkD(){
posServo = posServo - nbDeg; //tourner le capteur
libreDevant = testDevant();
//V&eacute;rifier si c&#39;est libre devant
if (libreDevant == 1)
{
posServo = 90; //remettre le servo au milieu
}
else
{
if (posServo == 0) //on arrive en fin de course
{
posServo = 90;
if(verifOpp = 0)
{
checkG()
}
else
{
verifOpp = 0;
demiTour()
}
}
else if(posServo &gt; 0) //On v&eacute;rifie de l&#39;autre c&ocirc;t&eacute;
{
checkD()
}
}
}
void setup() {
pinMode(13, OUTPUT); // initialize digital pin 13 as an output.
}
// the loop function runs over and over again forever
void loop() {
posServo = 90;
libreDevant = testDevant();
if(libreDevant = 1)
{
avancer()
}
else
{
resulTirage = tirageSort();
if (resulTirage = 0)
{
checkG()
avancer()
}
else
{
checkD()
avancer()
}
}
}
</pre>
</div>
</div>