Depuis le début de l'année 2023, la haute technologie est en train de sauter le pas dans une nouvelle dimension. Le cerveau humain sera-t-il bientôt remplaçé par l'intelligence artificielle des robots?
Depuis sa mise à jour du 30 novembre 2022, ChatGPT a mis le monde en émoi. Son habilité à délivrer des réponses proches des êtres humains à des questions non structurées a provoqué un sentiment de stupéfaction puis de peur. Emboîtons aussi le pas pour voir de quoi ChatGPT est capable dans la programmation de microcontrôleurs.
Cet article a pour but de montrer qu'on peut utiliser l'extraordinaire ChatCPT pour créer du code pour Arduino.
Comme exemples de démonstration, on va utiliser une carte Arduino Uno.
Brève pésentation de ChatGPT
ChatGPT est issu du groupe OpenAI. C'est un Chatbot comme il en existe tant d'autres. Sa puissance réside dans le fait qu'il peut générer du code programme à partir de questions non structurées pour nos microcontrolleurs.
Ses membre fondateurs
Sam ALTMAN - Ancien président de technologie accerator Y combinator;
ELon MUSK - CEO de Tesla, SpaceX et Twiter;
Reid HOFFMAN - Cofondateur de LinkedIn;
Jessica LIVINGSTON - Membre fondatrice de Y combinator;
Peter THIEL - Cofondateur de PayPal.
ChatGPT propose aussi un autre produit qu'il appelle DALL.E.2 image generator, il utilise aussi de l'intelligence artificielle pour créer des illustrations à partir de textes.
ChatGPT est un langage de modélisation autoregressif qui utilise le deeplearning pour produire un discours proche de l'être humain.
Il est basé sur OpenAI GPT-3.5 Langage Model. Pour comprendre comment il marche il faudra d'abord se familiariser avec la terminologie de base des langages de modélisation, à cela il faudra comprendre les notions de deeplearning, machine learning et neural network; ces trois notions constituent le squelette de ChatGPT.
Au moment où sont écrites ces lignes ChatGPT est gratuit d'utilisation, de part le nombre de sollicitations élevées dont il est sujet OpenAI propose quelque peu une version améliorée payante.
On peut donc imager que la version gratuite est une sorte de version Beta pour les tests.
Création de programmes
Ici partons de sur trois exemples pour créer du code c++ pour notre Arduino à l'aide de ChatGPT.
Premier exemple:
Ce premier exemple est vraiment très basique comme on peut le constater. On veut faire clignoter une LED connectée sur le port 6 d'Arduino toutes les secondes soit 0,5s allumée, 0,5s éteinte.
On va donc se connecter à l'interface ChatGPT, qui est vraiment très simple à utiliser. Mais auparanvant il faudra d'abord avoir des identifiants de connexion pour se connecter.
A présent on va lui demander de créer un programme qui allume puis éteint la LED toutes les demi secondes. On a écrit la requête en Anglais. ChatGPT va générer le programme, avec des commentaires et donne même des explications sur ce qu'il a proposé comme solution. On a pas collé ce programme basic ici.
En tout cas, c'est incroyable ça. Attention la même demande dans ChatGPT ne produira peut-être pas les mêmes lignes de code pour d'autres personnes.
En tout cas le programme proposé est correct. Aprés l'avoir téléversé dans Arduino, la LED clignote comme cela a été demandé.
Deuxième exemple:
Passons à présent au montage numéro deux. Dans ce montage, on va faire varier l'intensité lumineuse de la LED connectée sur le port numérique 6 de Arduino, à l'aide d'un potentiomètre un tour connecté sur l'entrée analogique A0 de Arduino.
Dans un premier temps testons d'abord le potentiomètre avec un petit programme qui va afficher sur la liaison série les différentes valeurs numériques qu'il va produire lorsq'on le tourne.
Voici le code produit par ChatGPT:
int potPin = A0; // Set the pin number for the potentiometer
int sensorValue = 0; // Initialize the sensor value variable
void setup() {
Serial.begin(9600); // Start serial communication with the default baud rate of 9600
}
void loop() {
sensorValue = analogRead(potPin); // Read the value of the potentiometer connected to analog input A0
Serial.println(sensorValue); // Print the sensor value to the serial monitor
delay(10); // Wait for a short amount of time before reading the potentiometer again
}
De même que dans l'exemple précédent on copie ce code on le colle dans l'interface Arduino, puis on téléverse.
On peut observer le résultat, quand on active le port série. Tout fonctionne correctement.
On peut donc faire notre requête pour un programme qui permet de faire varier l'intensité lumineuse de la LED.
Voici le code qu'il propose, il a tenu compte de la requête précédente car il considère que c'est un ajout à la demande précédente.
int ledPin = 6; // Set the pin number for the LED
int potPin = A0; // Set the pin number for the potentiometer
int sensorValue = 0; // Initialize the sensor value variable
void setup() {
pinMode(ledPin, OUTPUT); // Set the LED pin as an output
Serial.begin(9600); // Start serial communication with the default baud rate of 9600
}
void loop() {
sensorValue = analogRead(potPin); // Read the value of the potentiometer connected to analog input A0
int brightness = map(sensorValue, 0, 1023, 0, 255); // Map the sensor value to a brightness value between 0 and 255
analogWrite(ledPin, brightness); // Set the brightness of the LED
Serial.println(sensorValue); // Print the sensor value to the serial monitor
delay(10); // Wait for a short amount of time before reading the potentiometer again
}
On va copier tout ceci, puis avec les mêmes manipulations qu'avant -> Interface Arduino -> puis téléversement, on constate que le résultat est correct. Tout ceci sonne vraiment très bien. Une fois de plus le code fonctionne comme cela a été demandé.
Troisième exemple:
Passons à présent au dernier exemple. On veut pour ce montage que: la LED orange connectée sur le port 5 de Arduino clignote tous les quart de secondes, lorsqu'on appui sur le bouton poussoir connecté sur le port 7, la LED verte connectée sur le port 4 clignote toutes les 2 secondes (1s allumée, 1s éteinte), et faire varier l'intensité lumineuse de la LED rouge connectée sur le port 6 à l'aide du potentiomètre connecté sur l'entrée analogique A0 de Arduino.
On va donc demander à ChatGPT de créer un programme qui exécute toutes ces tâches en même temps.
Voici ce qu'il génère comme code. On va de nouveau copier, et coller ce code, dans l'interface de programmation, puis le téléverser.sur Arduino.
int led1 = 6;
int led2 = 5;
int led3 = 4;
int pot = A0;
int button = 7;
void task1() {
// Control the brightness of LED1 with the potentiometer
int brightness = map(analogRead(pot), 0, 1023, 0, 255);
analogWrite(led1, brightness);
}
void task2() {
// Blink LED2 every 250 milliseconds
digitalWrite(led2, HIGH);
delay(125);
digitalWrite(led2, LOW);
delay(125);
}
void task3() {
// Blink LED3 once per second if the button is pressed
if (digitalRead(button) == LOW) {
digitalWrite(led3, HIGH);
delay(1000);
digitalWrite(led3, LOW);
delay(1000);
}
}
void setup() {
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(pot, INPUT);
pinMode(button, INPUT_PULLUP);
}
void loop() {
task1();
task2();
task3();
}
En appuyant sur le bouton, la LED orange ne clignote pas comme prévu. De toute évidence le montage ne marche pas comme on pouvait s'y attendre.
Faut-il s'en prendre à ChatGPT? Toute fois on a omis de lire complètement les explications qu'il a proposé à la fin du programme.
Effectivement même si le montage semble assez basic, la tâche qu'on lui demande d'accomplir n'est pas aussi simple, pour un débutant en programmation; il faudrait faire appel aux régistres internes du microcontrolleur pour géner les timings des différentes tâches afin qu'elles puissent interagir le moins possible les unes des autres. ChatGPT a la fin de ses explications conseille l'emploi de la librairie (RTOS) pour des programmes plus complexes comme celui qui a été demandé. Si on suit le conseil de ChatGPT, ça marchera surement. Et pour cause on va lui demander d'utliser la fonction millis(). Et c'est ce qu'il va faire parfaitement.
int led1 = 6;
int led2 = 5;
int led3 = 4;
int pot = A0;
int button = 7;
unsigned long previousMillis2 = 0;
unsigned long previousMillis3 = 0;
const long interval2 = 250;
const long interval3 = 1000;
void task1() {
// Control the brightness of LED1 with the potentiometer
int brightness = map(analogRead(pot), 0, 1023, 0, 255);
analogWrite(led1, brightness);
}
void task2() {
// Blink LED2 every 250 milliseconds
unsigned long currentMillis = millis();
if (currentMillis - previousMillis2 >= interval2) {
previousMillis2 = currentMillis;
digitalWrite(led2, !digitalRead(led2));
}
}
void task3() {
// Blink LED3 once per second if the button is pressed
unsigned long currentMillis = millis();
if (digitalRead(button) == LOW) {
if (currentMillis - previousMillis3 >= interval3) {
previousMillis3 = currentMillis;
digitalWrite(led3, !digitalRead(led3));
}
} else {
digitalWrite(led3, LOW);
}
}
void setup() {
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(pot, INPUT);
pinMode(button, INPUT_PULLUP);
}
void loop() {
task1();
task2();
task3();
}
Une fois de plus,le montage fonctionne correctement. C'est vraiment incroyable.
Pour finir on va se poser la question est-ce que ChatGPT peut corriger le code que j'ai écrit effectivement? Prenons juste le petit exemple de code de la LED, où j'ai volontairement introduit une erreur dans une variable. On soumet la requête à ChatGPT. le résultat proposé est correct et en plus il y a des explications avec.
Il n'est pas dit qu'on obtiene les mêmes codes que ceux de ces deux exemples. Il faut l'avoir à l'esprit.
Au vu de ces exemples, on peut dire que ChatGPT est un véritable assistant pour les programmeurs, doté d'une intelligence artificielle. Je ne sais pas si pour l'heure il est capable de créer à lui tout seul des projets plus complexes faisant appel à plusieurs fichiers sources. Mais en tout cas l'avenir est prometteur.
Résumé de cet article en vidéo:
JtBB