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.
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.
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++