{"id":1189,"date":"2018-08-25T17:08:02","date_gmt":"2018-08-25T15:08:02","guid":{"rendered":"http:\/\/www.fabienm.eu\/wordpress\/?p=1189"},"modified":"2018-08-25T17:13:19","modified_gmt":"2018-08-25T15:13:19","slug":"piloter-un-servo-moteur-avec-le-kit-hifive1-a-coeur-risc-v","status":"publish","type":"post","link":"http:\/\/www.fabienm.eu\/wordpress\/2018\/08\/25\/piloter-un-servo-moteur-avec-le-kit-hifive1-a-coeur-risc-v\/","title":{"rendered":"Piloter un servo-moteur avec le kit HiFive1 \u00e0 c\u0153ur Risc-V"},"content":{"rendered":"<p>Pour prendre la main sur une nouvelle plate-forme \u00e9lectronique, la manip de base (hello world) est de faire clignoter une led. C&rsquo;est vrai qu&rsquo;avec une simple led on peut d\u00e9j\u00e0 \u00abafficher\u00bb quelques informations, il suffit pour cela de la faire clignoter de plusieurs mani\u00e8res diff\u00e9rentes pour obtenir l&rsquo;\u00e9tat du syst\u00e8me que l&rsquo;on veut conna\u00eetre.<\/p>\n<p>C&rsquo;est simple, c&rsquo;est visuel et c&rsquo;est rigolo. Seulement c&rsquo;est vraiment tr\u00e8s basique et on pourrait innover un peut dans le \u00abHello World de l&rsquo;\u00e9lectronique\u00bb. Par exemple en faisant bouger un servomoteur !<\/p>\n<p>Le signal de commande <a href=\"https:\/\/fr.wikipedia.org\/wiki\/Servomoteur#Fonctionnement\">d&rsquo;un servo-moteur est assez simple<\/a>, il faut envoyer une pulsation de largeur 1ms (min) \u00e0 2 ms (max) toute les 20ms.<\/p>\n<p>Si on utilise un petit servo-moteur en 5v comme <a href=\"http:\/\/www.towerpro.com.tw\/product\/sg90-7\/\">celui-l\u00e0<\/a> en plus, il suffit de l&rsquo;alimenter par le 5 volt du kit et \u00e7a roule.<\/p>\n<p>On trouve des propositions de montages pour piloter des servomoteurs sur <a href=\"https:\/\/www.arduino.cc\/en\/Tutorial\/Knob\">le site d&rsquo;arduino,<\/a> mais le code donn\u00e9 ne fonctionne pas (encore?) avec le HiFive1 puisque la biblioth\u00e8que Servo n&rsquo;est pas impl\u00e9ment\u00e9e pour le Risc-V.<\/p>\n<p>Avec un microcontr\u00f4leur comme le <a href=\"https:\/\/www.sifive.com\/products\/hifive1\/\">Hifive1<\/a> m\u00eame pas besoin d&rsquo;utiliser des trucs compliqu\u00e9s comme les PWM ou les timer. En effet le core p\u00e9dale tellement vite (320Mhz) qu&rsquo;une simple commutation dans la boucle principale avec des d\u00e9lais bien ajust\u00e9s suffisent \u00e0 g\u00e9n\u00e9rer le signal de pilotage correctement.<\/p>\n<p>Pour un essais rapide, on peut simplement utiliser <a href=\"https:\/\/www.arduino.cc\/en\/Main\/Software\">l&rsquo;IDE d&rsquo;arduino<\/a> comme je l&rsquo;avais expliqu\u00e9 dans un <a href=\"http:\/\/www.fabienm.eu\/flf\/prise-en-main-du-kit-de-dev-hifive1-freedom-e310\/\">pr\u00e9c\u00e9dent article.<\/a><\/p>\n<p>La fonction g\u00e9n\u00e9rant le signal utilise des <code>delayMicroseconds<\/code>():<\/p>\n<pre><code>void servo(int pos){\r\n  digitalWrite(pwmpin, HIGH);\r\n  delayMicroseconds(pos);\r\n  digitalWrite(pwmpin, LOW);\r\n  delayMicroseconds(16000); \r\n  delayMicroseconds(4000); \r\n}<\/code><\/pre>\n<p>D&rsquo;apr\u00e8s <a href=\"https:\/\/www.arduino.cc\/reference\/en\/language\/functions\/time\/delaymicroseconds\/\">la doc<\/a> la fonction de delaymicroseconds ne peut pas attendre plus de 16383 microsecondes. Du coup pour d\u00e9passer les 20ms on va l&rsquo;appeler deux fois \ud83d\ude09<\/p>\n<p>Le \u00abpilotage\u00bb du servo se fait via une entr\u00e9e bouton, quand on appui sur le bouton le servomoteur est en position minimal et quand on rel\u00e2che le bouton le servomoteur se met en position maximal.<\/p>\n<pre><code>\r\n  if (readbtn == HIGH) {\r\n   servo(1000);\r\n  } else {\r\n   servo(2000);\r\n  }\r\n<\/code><\/pre>\n<p>Le code complet:<\/p>\n<pre><code>\r\nint pwmpin = 9; \/\/ pwm servo pin\r\nint btnpin = 7; \/\/ \u00abinput button\u00bb\r\nint readbtn = LOW;\r\n\r\n\/\/ the setup function runs once when you press reset or power the board\r\nvoid setup() {\r\n  \/\/ initialize digital pin LED_BUILTIN as an output.\r\n  pinMode(LED_BUILTIN, OUTPUT);\r\n  pinMode(pwmpin, OUTPUT);\r\n  pinMode(btnpin, INPUT);\r\n  digitalWrite(LED_BUILTIN, HIGH);   \/\/ turn the LED on (HIGH is the voltage level)\r\n}\r\n\r\nvoid servo(int pos){\r\n  digitalWrite(pwmpin, HIGH);\r\n  delayMicroseconds(pos);\r\n  digitalWrite(pwmpin, LOW);\r\n  delayMicroseconds(16000); \r\n  delayMicroseconds(8000); \r\n}\r\n\r\n\/\/ the loop function runs over and over again forever\r\nvoid loop() {\r\n  readbtn = digitalRead(btnpin);\r\n  if (readbtn == HIGH) {\r\n   servo(1000);\r\n  } else {\r\n   servo(2000);\r\n  }\r\n}\r\n<\/code><\/pre>\n<p>Une petite vid\u00e9o du fonctionnement du montage :<br \/>\n<iframe loading=\"lazy\" src=\"https:\/\/www.youtube.com\/embed\/HDaqD6CG7Po\" width=\"560\" height=\"315\" frameborder=\"0\" allowfullscreen=\"allowfullscreen\"><\/iframe><\/p>\n<p>Voila, c&rsquo;\u00e9tait rigolo de bidouiller le kit HiFive1 avec l&rsquo;IDE playscool d&rsquo;arduino, mais maintenant il va falloir passer \u00e0 des trucs plus s\u00e9rieux en utilisant du code C (puis assembleur) via la toolchain gnu de compilation.<\/p>\n<p>\u00c0 suivre donc&#8230;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Pour prendre la main sur une nouvelle plate-forme \u00e9lectronique, la manip de base (hello world) est de faire clignoter une led. C&rsquo;est vrai qu&rsquo;avec une simple led on peut d\u00e9j\u00e0 \u00abafficher\u00bb quelques informations, il suffit pour cela de la faire &hellip; <a href=\"http:\/\/www.fabienm.eu\/wordpress\/2018\/08\/25\/piloter-un-servo-moteur-avec-le-kit-hifive1-a-coeur-risc-v\/\">Continuer la lecture <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[192,11],"tags":[187,194,188,195],"class_list":["post-1189","post","type-post","status-publish","format-standard","hentry","category-electronique","category-programmation","tag-arduino","tag-hifive1","tag-risc-v","tag-servomoteur"],"_links":{"self":[{"href":"http:\/\/www.fabienm.eu\/wordpress\/wp-json\/wp\/v2\/posts\/1189","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.fabienm.eu\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.fabienm.eu\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.fabienm.eu\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.fabienm.eu\/wordpress\/wp-json\/wp\/v2\/comments?post=1189"}],"version-history":[{"count":3,"href":"http:\/\/www.fabienm.eu\/wordpress\/wp-json\/wp\/v2\/posts\/1189\/revisions"}],"predecessor-version":[{"id":1192,"href":"http:\/\/www.fabienm.eu\/wordpress\/wp-json\/wp\/v2\/posts\/1189\/revisions\/1192"}],"wp:attachment":[{"href":"http:\/\/www.fabienm.eu\/wordpress\/wp-json\/wp\/v2\/media?parent=1189"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.fabienm.eu\/wordpress\/wp-json\/wp\/v2\/categories?post=1189"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.fabienm.eu\/wordpress\/wp-json\/wp\/v2\/tags?post=1189"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}