Experimenteren met Microcontrollers

Gezien Tycho erg graag kleine projectjes doet met een Arduino Uno pakket, ben ik ook maar weer eens in die hobby gedoken. Vroeger met de modelbouw hebben we toch behoorlijk vaak verschillende microcontrollers gebruikt voor het maken van bijvoorbeeld “Landing Gear Door Sequencers” en flitslicht programma’s voor verlichting van modelvliegtuigen en dergelijke.

Tegenwoordig is het een stuk eenvoudiger, hoewel je eerst wijs moet kunnen worden aan het erg grote aanbod en verscheidenheid van alle controllers. Arduino is zeker een fantastisch startpunt, en voor velen denk ik ook het enige wat ze nodig hebben. Inmiddels zijn er ook versies die niet alleen in C++ kunnen worden geprogrammeerd, maar ook in MicroPython. De Arduino Nano ESP32 was mijn eerste controller die ik hiermee heb kunnen programmeren. Fijn om er mee te leren omgaan.

Solderen van headers op een Pro Micro ATMega32U4

Soms zitten er wel kleinere, of grotere uitdagingen aan het experimenteren met verschillende sensoren of controllers. Zeker als je bijvoorbeeld een kloon van een ontwikkelingsbord gebruikt.

Een bijzonder zoekwerkje was o.a. het gebruik van een USB-C Pro Micro ATMega32U4 kloon, op mijn MacBook Pro met USB-C naar USB-C werkte niets, er werd ook geen apparaat aan USB herkend. Met een USB-A blok en kabel werkte deze weer wel.

Daarvoor dacht ik eerst dat er geen bootloader aanwezig was, deze heb ik dan eerst maar m.b.v. een Arduino Uno R4 WiFi zelf geïnstalleerd (Via de Adruino as ISP methode) maar dit bood geen oplossing. Na een stuk verder zoeken had iemand over een dergelijk probleem, dus die kabel via USB-A aangesloten, en dat werkte nog ook.

De Pro Micro als Copy / Paste / Cut Keyboard op een breadboard

Het volgende stukje C++ code is wat ik heb geschreven voor het bovenstaande Pro Micro controllertje met drie drukknoppen. De code is omschrijvend geschreven met remarks, voor uitleg wat de code doet.

/*
  USB Keyboard Buttons for Pro Micro controller
  Copy / Paste / Cut on buttons

  Connect Pins 7, 8 and 9 via pushbuttons to GND.
  2024 Richard, webwings.nl
*/

// Libraries:
#include <arduino.h>
#include <Keyboard.h>

// Definitions and Global Variables:
#define serialBaud 115200
bool debugProg = true;              // If you want to debug with the Serial Monitor.
int RXLED = 17;                     // No built-in LED, using the RX LED on Pin 17.
unsigned long previousTime = 0;     // Starttime
unsigned long delayTime = 2000;     // Non-blocking delay in ms

// Setup the Pro Micro:
void setup() {
  delay(500);                       // MCU Startup-delay.
  // Setup Monitor, if required, and the inputs.
  if (debugProg) {
    Serial.begin(serialBaud);       // Setup the baudrate.
    while(!Serial) {
      // Wait for the Serial Monitor to start
    }
    Serial.println("** Pro Micro ATMega32U4 **");
    Serial.print("Sensor Delay (ms):"); Serial.println((float)delayTime, 0);
  }
  // Define the previousTime as now
  previousTime = millis();

  // Start the Keyboard
  Keyboard.begin(); 

  pinMode(7, INPUT_PULLUP); // Here we use the internal pull-up resistors on the
  pinMode(8, INPUT_PULLUP); // Pro Micro, otherwise adapt this code, and use your 
  pinMode(9, INPUT_PULLUP); // own input GPIO's.

  // Use the onboard LED
  pinMode(RXLED, OUTPUT);
}

// Main Pro Micro MCU program: 
void loop() {
  // Do this task after every non-blocking delay has passed:
  if (millis()>=previousTime + delayTime) {
    // Place for aditional code:

    // Set the timer again.
    previousTime = millis();
  }

  // Wait for the buttons to be pressed
  if (digitalRead(7)==LOW) {
    if (debugProg) {
      Serial.println("Button on pin 7 is pressed");
    }
    // Keyboard Copy command:
    Keyboard.press(KEY_LEFT_GUI); // Command Button Mac OSX
    Keyboard.press('c');
    
    // Dirty debounce and flash the LED
    digitalWrite(RXLED, !digitalRead(RXLED));
    delay(200);
    digitalWrite(RXLED, !digitalRead(RXLED));

    Keyboard.releaseAll();
 }
  if (digitalRead(8)==LOW) {
    if (debugProg) {
      Serial.println("Button on pin 8 is pressed");
    }
    // Keyboard Paste command:
    Keyboard.press(KEY_LEFT_GUI); // Command Button Mac OSX
    Keyboard.press('v');
    
     // Dirty debounce and flash the LED
    digitalWrite(RXLED, !digitalRead(RXLED));
    delay(200);
    digitalWrite(RXLED, !digitalRead(RXLED));

    Keyboard.releaseAll();
  }
  if (digitalRead(9)==LOW) {
    if (debugProg) {
      Serial.println("Button on pin 9 is pressed");
    }
    // Keyboard Cut Command:
    Keyboard.press(KEY_LEFT_GUI); // Command Button Mac OSX
    Keyboard.press('x');
 
    // Dirty debounce and flash the LED
    digitalWrite(RXLED, !digitalRead(RXLED));
    delay(200);
    digitalWrite(RXLED, !digitalRead(RXLED));

    Keyboard.releaseAll();
  }
}
Arduino C++