De nieuwe handige tool in de gereedschapskist van software-hobbyisten is ChatGPT. Die kan niet alleen compleet nieuwe code schrijven, maar ook handgeschreven software aanvullen en verbeteren. In dit artikel probeert Elektor-auteur Peter Neufeld dit uit en komt met verschillende verbeteringen voor zijn populaire magnetische levitaie-project.
 

Iedereen die bekend is met de wereld van hardware- en softwareprojecten weet hoe die de neiging hebben om nog lang na te echoën. Het bouw- en programmeerproces kan leuk zijn en het resulterende project kan redelijk goed functioneren, maar toch zijn er bijna altijd functies die je zou willen aanpassen of toevoegen in de software – maar daarvoor lijk je nooit tijd te hebben omdat je andere dingen te doen hebt. Dit was ook het geval met de Arduino C++ code voor mijn project ‘Magnetische levitatie op de digitale manier”, dat ik heb beschreven in Elektor , op Elektor Labs en op mijn eigen website . De hardware werkt prima, maar de Arduino-code was snel in elkaar geknutseld om te laten zien dat het in principe werkt. ‘Af’ en ‘mooi’ zijn echter heel verschillende zaken!


Toen ik me ging bezighouden met de mogelijkheden van AI, kwam al snel de gedachte bij mij op of ChatGPT me zou kunnen helpen met mijn hobby-softwareprojecten. Bij eerste experimenten was ik al snel in staat om kleine stukjes code en complete Arduino C++ programma’s te laten genereren door ChatGPT die overeenkwamen met mijn ruwe specificaties die ik had geformuleerd in eenvoudige technische taal. Daarom kristalliseerden zich uiteindelijk twee benaderingen uit om mijn hobby te ondersteunen met AI:

1. Uitbreiding/aanvulling van bestaande programma’s: is het mogelijk om bestaande en functionerende Arduino C++ code uit te breiden met extra softwarefuncties door de oude code en specifieke vragen door te geven aan ChatGPT?

2. Volledig nieuwe code: Kan een compleet nieuw uitvoerbaar Arduino C++ programma worden gegenereerd door ChatGPT door de AI via een interactieve functiebeschrijving daartoe opdracht te geven?

Chatmaglev project
Figuur 1. De hardware van het MagLev-project.

Ik heb beide benaderingen getest met mijn ESP32-gebaseerde magnetische levitatie-projetc. Figuur 1 toont de hardware en figuur 2 de schakeling op dat moment. Om vooruit te lopen op het resultaat: voor mij, als gelegenheids- en hobbyprogrammeur, gaan er ineens deuren open die voorheen maar half open of zelfs helemaal dicht waren. Dit doet de ongetwijfeld duistere aspecten van het gebruik van AI-systemen bijna vergeten. Het goed werkende MagLev-systeem op de kopfoto hierboven is een zichtbaar resultaat van AI-ondersteund werk.
 

The MagLev project’s old circuit diagram.
Figuur 2. Het oude schema van het MagLev-project

Benadering 1: uitbreidingen van bestaande programmacode

Mijn oude code werkte weliswaar, maar was meer een skelet dat nog steeds wachtte op enkele nuttige uitbreidingen. Ik heb geprobeerd mijn gedachten samen te vatten in een enkele vrij uitgebreidere vraag en opdracht. Maar in principe kun je met ChatGPT een dialoog opbouwen en vervolgvragen stellen.

Dit is mijn ietwat complexe vraag aan ChatGPT:

 

De volgende Arduino C++ code voor een ESP32 moet worden uitgebreid. De triggerwaarden moeten nu met 1 worden verhoogd of verlaagd met de toets ‘T’ respectievelijk ‘t’ gevolgd door CR en LF via de seriële verbinding. Iets vergelijkbaars voor de hysteresiswaarde. Een vierde commando slaat alle huidige waarden op in niet-vluchtig RAM. Als ze aanwezig zijn, worden ze bij het opstarten gebruikt. Gebruik de preferences-lib. De nieuwe waarden worden serieel weergegeven. Voeg de nodige programmacode toe en retourneer het complete programma.
 

/**************************************

Magnetic Levitation object:

Lets a LEGO man, glued together with

a neobodymium magnet, float under a modified 5V relay

- SoC:            ESP32, very good:

M5Stack’s ATOM LITE or ATOM MATRIX

- Electromagnet:  Modified 5V-Relais HW-482

with 3V3/5V transistor input

- Sensor:         HALL-sensor A1302 or A1308

***************************************/

 

// int TRIGGER     = 2740;

// Triggerlevel is set to a level where

// weight of payload is equal to the force

// between magnet and electromagnet 

int TRIGGER     = 2740;

// good for payload =

// 2 Neobdym-Magnets  and a LEGO-Man 

int HYST        = 35;  

// Hysterese for trigger level

int HALL_PIN    = 33;  

// analog Signal from HALL-sensor at GPIO33

int HALL_VAL    = 0;  

int RELAIS_PIN  = 23;  

// GPIO23 to drive the transistor input of

// the modified 5V-relais  that is used as electromagnet

int X           = 0;  

 

void setup(){

  Serial.begin(115200);

  pinMode(RELAIS_PIN, OUTPUT);

  Serial.print("Magnetic Levitation:   START " );

}

 

void loop(){

  HALL_VAL =analogRead(HALL_PIN);

      //read HALL-Sensor with

      //default 0-3.9V input >> 12bit

  if (HALL_VAL < (TRIGGER + X) ){

    digitalWrite(RELAIS_PIN, HIGH);

      // lift the payload

    X = HYST;

  }

  else{

    digitalWrite(RELAIS_PIN, LOW);     

      // drop the payload

    X = 0 - HYST;

  }

}

 

Je kunt mijn oude code en het antwoord van ChatGPT met de verbeterde code zien in listing 1.
 

Chatgpt AI: Listing 1: Extension of hand written Code.
Listing 1. Uitbreiding van de handgeschreven code.

Mijn eerste reactie: wow! Dat was makkelijk! Lijkt correcte en logische code te zijn. Voldoet aan mijn eisen en draaide geweldig toen ik het testte! Ik had het misschien op dezelfde manier geschreven, maar alleen als ik meer bedreven was in programmeren in C++ en/of veel voorbeeldcode had opgezocht en aangepast – en dat had me ongetwijfeld veel tijd gekost.

Goed! Nu laten we de oude code weg en beginnen helemaal opnieuw met duidelijke taal.

Benadering 2: volledig nieuwe Arduino C++ code

Aangemoedigd ging ik toen over op een conversationele beschrijving van mijn levitatie-opstelling die verbeterd moest worden, en van de gewenste softwarefuncties... en was zeer verbaasd hoe goed het resultaat was.

Dit was mijn dialoog met ChatGPT:

 

De volgende magnetische levitatie-opstelling moet worden bestuurd met een ESP32 en een C++ Arduino-programma. Pin 23 stuurt een elektromagneet met ijzeren kern aan, pen 33 is de ADC-ingang waarop een analoge Hall-sensor is aangesloten.

Onder de elektromagneet bevindt zich de analoge Hall-sensor. De elektromagneet wordt aanvankelijk ingeschakeld. Een permanente magneet nadert de elektromagneet, de ijzerkern en de Hall-sensor van onderaf. De magneet wordt aangetrokken door de kern. De magneet moet echter blijven zweven. Hiervoor moet de elektromagneet kort worden uitgeschakeld.

De Hall-sensor genereert een spanning van ongeveer 2,4 V in zwevende toestand en ongeveer 1,5 V zonder de permanente magneet. Als de magneet heel dicht bij de sensor komt, stijgt de spanning tot maximaal 3 V.

Tijdens de uitvoering van het programma moet de triggerwaarde voor de zwevende toestand in kleine stapjes omhoog worden gecorrigeerd via de seriële interface (115200 Baud, 8N1) als ‘T’ wordt ontvangen. Bij ‘t’ wordt de waarde naar beneden gecorrigeerd.

Daarnaast moet, net als de triggerwaarde, ook een hysteresiswaarde van ongeveer 50 mV worden ingesteld en navenant worden gecorrigeerd met behulp van toetsenbordopdrachten.

De handmatig gecorrigeerde waarden van trigger en hysteresis moeten beide worden uitgevoerd als ze zijn gewijzigd. Beide waarden moeten veilig worden opgeslagen in het niet-vluchtige geheugen van de ESP32 wanneer ‘S’ of ‘s’ wordt ingevoerd. Alleen als er al oude waarden in het niet-vluchtige geheugen staan, moeten deze worden gebruikt als de beginwaarden bij de programmastart.

Bij het opstarten moet een zeer korte beschrijving van de bewerking worden getoond.

Schrijf het Arduino-programma zeer compact en met niet al te veel commentaar, zodat het in zijn geheel in het antwoord past.

 

In listing 2 zie je het antwoord van ChatGPT, dat me nog steeds verbaast en zelfs een beetje bang maakt.
 

Listing 2: Generated Code and Answer from ChatGPT
Listing 2. Gegenereerde code en antwoord van ChatGPT.

Daarna vroeg ik de ’bot om voor documentatiedoeleinden een korte beschrijving van de code te geven.

Het antwoord van ChatGPT:

De geleverde code is een compact Arduino-programma geschreven in C++ voor het besturen van een magnetische levitatie-opstelling met behulp van een ESP32-microcontroller. De opstelling bestaat uit een elektromagneet met een ijzerkern en een analoge Hall-sensor.

Bij het opstarten initialiseert het programma de seriële communicatie met een baudrate van 115200. Pin 23 wordt gebruikt om de elektromagneet aan te sturen en pin 33 wordt geconfigureerd als analoge ingang om de uitgangsspanning van de Hall-sensor in te lezen.

Het programma haalt de trigger- en hysteresiswaarden op uit het niet-vluchtige geheugen (EEPROM) als ze eerder waren opgeslagen. Als er geen waarden worden gevonden, worden standaardwaarden gebruikt. De triggerwaarde vertegenwoordigt de spanningsdrempel voor het uitschakelen van de elektromagneet en de hysteresiswaarde definieert het spanningsbereik waarbinnen de elektromagneet uitgeschakeld blijft, zelfs als de magneet iets van de sensor verwijderd is.

Het programma geeft vervolgens een korte beschrijving van de werking en de beschikbare commando’s via de seriële monitor. Met de commando’s kun je de trigger- en hysteresiswaarden verhogen of verlagen. De bijgewerkte waarden worden onmiddellijk weergegeven via de seriële monitor. Om de trigger- en hysteresiswaarden op te slaan in het niet-vluchtige geheugen kan de gebruiker het commando ‘S’ of ‘s’ invoeren.

In de hoofd-programmalus wordt de analoge waarde van de Hall-sensor gelezen en vergeleken met de triggerwaarde plus de hysteresiswaarde. Als de sensormeting boven deze drempelwaarde komt, wat aangeeft dat de magneet dichtbij is, wordt de elektromagneet uitgeschakeld door pin 23 laag te maken. Anders, als de magneet ver weg is, wordt de elektromagneet ingeschakeld door pin 23 hoog te maken.

Het programma controleert voortdurend of er commando’s van de seriële monitor binnenkomen. Als een commando wordt ontvangen, past het de trigger- of hysteresiswaarde overeenkomstig aan. Als het commando ‘S’ of ‘s’ wordt ingevoerd, worden de trigger- en hysteresiswaarden opgeslagen in het niet-vluchtige geheugen.

De actuele trigger- en hysteresiswaarden worden uitgevoerd naar de seriële monitor wanneer ze gewijzigd worden, of bij het opstarten van het programma.

Dit programma biedt een eenvoudige en compacte oplossing voor het besturen van een magnetische levitatie-opstelling met een ESP32-microcontroller.

Inschrijven
Schrijf u in voor tag alert e-mails over ChatGPT!

Verbeteringen

Dat is mooi en prachtig, maar alles kan nog worden geoptimaliseerd. Ik vroeg de ’bot om drie korte suggesties om de regelkring te verbeteren. ChatGPT retourneerde deze suggesties:

 

1. PID-besturing implementeren: overweeg om een PID-regelkring (proportioneel, integrerend, differentiërend) te implementeren om de stabiliteit en het reactievermogen van het magnetische levitatie-systeem te verbeteren. Door terugkoppeling van de Hall-sensor te gebruiken en de juiste regelversterkingen toe te passen, kan de PID-regelaar het vermogen van de elektromagneet dynamisch aanpassen om de gewenste levitatie-afstand te handhaven. Dit verbetert het vermogen van het systeem om storingen op te vangen en zorgt voor een soepelere regeling.

2. Gebruik een voortschrijdend gemiddelde-filter: pas een voortschrijdend gemiddelde-filter toe om ruis en schommelingen in de metingen van de Hall-sensor te reduceren. In plaats van alleen te vertrouwen op individuele metingen, bereken je de gemiddelde waarde gedurende een klein venster van recente metingen. Dit zorgt voor een meer stabiele en betrouwbare meting om de positie van de magneet te bepalen en het vermogen van de elektromagneet navenant aan te passen.

3. Bouw een time out-beveiliging in: voeg een veiligheidsmechanisme toe aan de regelkring om ervoor te zorgen dat de elektromagneet niet continu stroom voert als de magneet of de sensor afwezig is of uitvalt. Als het systeem binnen een bepaalde periode geen geldige Hall-sensormeting ontvangt, kan het aannemen dat er iets mis is en de juiste actie ondernemen, zoals het uitschakelen van de elektromagneet of het activeren van een foutconditie.

 

Door deze suggesties toe te passen, kun je de prestaties, de ruis-ongevoeligheid en de veiligheidsfuncties van de regelkring verbeteren, wat resulteert in een nauwkeurigere en betrouwbaardere magnetische levitatie-besturing.

Ik geef toe dat mijn eerste vragen hierboven tot stand kwamen na een aantal lange dialogen waarin ik ook moest leren hoe ik mijn vragen op een ChatGPT AI-vriendelijke manier kon formuleren.

Tussen haakjes: de antwoorden van ChatGPT werden vaak gewoon bruut afgekapt. Een specifiek verzoek om een mogelijke beperking van de lengte van het antwoord resulteerde in een zeer breedsprakig en hier zeer ingekort “Ja, 2048 tekens”. Daarom heb ik in mijn ‘opdracht’ ook aanwijzingen opgenomen voor een mogelijke inkorting van het antwoord.

Als je echter een beetje vertrouwd bent geraakt met de reacties van het systeem, zijn de resultaten ook erg goed na alleen een enkel complex blok met, eisen en instructies. Gerichte vragen voegen verdere, ook uitgebreidere functies toe.

Als het resultaat technisch niet lijkt te kloppen, is het interessant om te zien dat dezelfde vraag die meerdere keren wordt herhaald, telkens anders wordt beantwoord, wat zich uit in code met een soms compleet andere structuur, maar die meestal wel functioneel is. Het is dan erg nuttig, misschien zelfs essentieel, om in ieder geval de gegenereerde code goed te kunnen lezen en te kunnen controleren of aan alle eisen wordt voldaan. ChatGPT laat al snel het ene of het andere aspect achterwege!

Suggesties van de AI die in tegenspraak zijn met je eigen technische expertise en kennis, kunnen specifiek in twijfel worden getrokken. Dit leidt vaak tot verontschuldigende formuleringen en verbeterde suggesties. Of het kan je nieuwe technische kennis opleveren.

Al met al is het gebruik van ChatGPT om software te schrijven op basis van een probleembeschrijving in natuurlijke taal hier zeer nuttig gebleken. Het werkt misschien niet als een voorhamer, maar eerder als een nauwkeurig instelbaar en controleerbaar gereedschap.

Zelfs een minder ervaren C++ programmeur zoals ik kan nu snel complexe programmafragmenten maken die me vroeger veel meer tijd zouden hebben gekost. Documentatie is nu heel eenvoudig. En je mag zelfs een soort dieper begrip van het gestelde probleem verwachten, wat mogelijkheden opent voor onverwachte, technisch goed onderbouwde en gedetailleerde zijpaden.

Op dit moment is AI, vooral ChatGPT, echter een nuttig, maar zeker niet onfeilbaar hulpmiddel voor de vrijetijds-programmeur, en het moet nog altijd door een mens worden bediend! Ik verheug me al over meer projecten met deze nieuwe tool die een plaatsje in mijn gereedschapskist heeft gekregen.

Enkele problemen oplossen

Alsof mijn conclusies nog meer bewijs nodig hadden: bij het testen van de gegenereerde code merkte ik dat er twee problemen mee waren. OK... laten we het de machine vragen!

Corrigeer twee problemen.

1. De waarde van de Hall-sensor wordt altijd vergeleken met een vaste waarde zonder hysteresis.

2. Deze code slaat de waarden niet correct op in het niet-vluchtige RAM van mijn ESP32. Gebruik een andere methode voor opslag en uitlezing.

 

Herschrijf de eerdere code zeer compact en met niet al te veel commentaar, zodat deze volledig in het antwoord past.

 

ChatGPT antwoordde met “Excuses voor de omissie” (!) en retourneerde de code van listing 3.
 

Listing 3: Enhanced Code.
Listing 3. Verbeterde code.

Nou, dat werkte nu heel goed. Tijdens het testen ontdekte mijn menselijk brein echter nog een klein probleempje! Maar nu, in deze verbeterde staat, ben ik tot de conclusie gekomen dat dit ook een onvoltooid softwareproject moet blijven. Dus ik beëindigde de chat en dronk koffie met mijn echtgenote.


This article (230360-03) appears in the January/February 2024 edition of Elektor Mag.


Vragen of opmerkingen?

Hebt u technische vragen of opmerkingen naar aanleiding van dit artikel? Stuur een e-mail naar de auteur via peter.neufeld@gmx.de of naar de redactie van Elektor via redactie@elektor.com.


Inschrijven
Schrijf u in voor tag alert e-mails over Artificial Intelligence!