Working for a new boss, doing these kinds of projects for a living now.
Writing courses, doing consultancy work and creating cool projects.
I’ll be posting stuff at a later time.
Working for a new boss, doing these kinds of projects for a living now.
Writing courses, doing consultancy work and creating cool projects.
I’ll be posting stuff at a later time.
I started a little case for a collection of Raspberry devices.
Over the years, many Raspberries were designed and made.
It all started in 2012
I want to have a case with all RP’s i’ve used.
There are many iterations of the RPi, I’m missing a lot now. If you want to help me, send me old/broken raspberries to get the collection complete!
This is the case at the moment
The case isn’t glued together yet. I’m not sure how and what to include.
Get information about your RPi version
curl -L https://perturb.org/rpi?rev=$(awk '/^Revision/ { print $3 }' /proc/cpuinfo)
My scope didn’t save the test capture .. Next time.
But I could see the clear ones and zeros.
Dirk cleaned up a OCR version of the program, which I cleaned up some more, and found some errors.
So that should be okay now.
Woo-hoo!
In 2013 I converted an online list of movies from here:
https://www.imdb.com/chart/top/
We watched all of them. ( And others .. )
Some unknown beauties. Some we didn’t understand or liked. But we persevered. We can do this!
See also:
Are we done? .. No, next to check, are the movies which entered the list after 250. Maybe half of the new ones we’ve seen ..
I’ve got my SDK-85 cassette interface PCB’s in, If you want to have the Kicad files. Message me.
My 3D printer has a worn out hot-end .. so a new one to install.
BBQ time! .. That’s from 1-januari till 31-december .. rain, snow storm whatever.
I’ve made a lot of Rubs/Sauces and marinades.
But a new book i always welcome ..
Also new recipes and tips. Let me know.
Sunday a day of music with our folkband.
Played some old and new tunes.
Did some Vulkan / OpenGL benchmark testing.
Cleaned and fixed our wine cellar.
And tomorrow i’m starting new work.
Quick mash-up as proof of concept.
400 frames
Let measure the level of beer in a metal tank .. 🙂
Install and start Thonny.
Tools > Options > Interpreter
Python test code (1 second blink)
Note: for the normal pico without Wi-Fi, it is GP25 instead of LED.
from machine import Pin import utime led_onboard = Pin('LED', Pin.OUT) while True: led_onboard.on() utime.sleep(1) led_onboard.off() utime.sleep(1)
Run at boottime?
File > save as:
Select device and name the python script main.py
Point the sensor at yourself when behind your computer.
When you leave your computer for some seconds, it wil automatically lock your screen. (Windows-L keypress)
The RP2040 is configured as HID so it emulates a keyboard.
Just connect via an usb-cable to your machine
Arduino Code
File > Preferences > Additional Board URLS
https://github.com/earlephilhower/arduino-pico/releases/download/global/package_rp2040_index.json
Change USB Stack!
Download and install Adafruit_TinyUSB.zip
#include "Adafruit_TinyUSB.h" // defines pins numbers const int trigPin = D4; const int echoPin = D5; // defines variables long duration; int distance; int maxcounter; uint8_t const desc_hid_report[] = { TUD_HID_REPORT_DESC_KEYBOARD() }; // D0-D3 NOT USED AT THE MOMENT, I'VE GOT IDEAS FOR EXTRA FUNCTIONALLITY! // USB HID object. For ESP32 these values cannot be changed after this declaration // desc report, desc len, protocol, interval, use out endpoint Adafruit_USBD_HID usb_hid(desc_hid_report, sizeof(desc_hid_report), HID_ITF_PROTOCOL_KEYBOARD, 2, false); //------------- Input Pins -------------// // Array of pins and its keycode. uint8_t pins[] = { D0, D1, D2, D3 }; // number of pins uint8_t pincount = sizeof(pins)/sizeof(pins[0]); // For keycode definition check out https://github.com/hathach/tinyusb/blob/master/src/class/hid/hid.h uint8_t hidcode[] = { HID_KEY_0, HID_KEY_1, HID_KEY_2, HID_KEY_3 , HID_KEY_4, HID_KEY_5 }; #if defined(ARDUINO_SAMD_CIRCUITPLAYGROUND_EXPRESS) || defined(ARDUINO_NRF52840_CIRCUITPLAY) || defined(ARDUINO_FUNHOUSE_ESP32S2) bool activeState = true; #else bool activeState = false; #endif void setup() { // Setting pins for Ultrasonic Sensor HC-SR04 pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output pinMode(echoPin, INPUT); // Sets the echoPin as an Input #if defined(ARDUINO_ARCH_MBED) && defined(ARDUINO_ARCH_RP2040) // Manual begin() is required on core without built-in support for TinyUSB such as mbed rp2040 TinyUSB_Device_Init(0); #endif // Set up output report (on control endpoint) for Capslock indicator // Not used .. yet usb_hid.setReportCallback(NULL, hid_report_callback); usb_hid.begin(); // overwrite input pin with PIN_BUTTONx // NOT USED #ifdef PIN_BUTTON1 pins[0] = PIN_BUTTON1; #endif #ifdef PIN_BUTTON2 pins[1] = PIN_BUTTON2; #endif #ifdef PIN_BUTTON3 pins[2] = PIN_BUTTON3; #endif #ifdef PIN_BUTTON4 pins[3] = PIN_BUTTON4; #endif // Set up pin as input for (uint8_t i=0; i<pincount; i++) { pinMode(pins[i], activeState ? INPUT_PULLDOWN : INPUT_PULLUP); } // wait until device mounted while( !TinyUSBDevice.mounted() ) delay(1); maxcounter =0; } void loop() { // Clears the trigPin digitalWrite(trigPin, LOW); delayMicroseconds(2); // Sets the trigPin on HIGH state for 10 micro seconds digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); // Reads the echoPin, returns the sound wave travel time in microseconds duration = pulseIn(echoPin, HIGH); // Calculating the distance distance = duration * 0.034 / 2; // Prints the distance on the Serial Monitor - DEBUG //Serial.print("Distance: "); //Serial.println(distance); // Below will wait for more than 100 measurements with a distance of 100 // Then it will send a WINDOWS-L (lock) keyboard combination if (distance > 100) { maxcounter +=1; } else { maxcounter = 0; } if (maxcounter > 100 && maxcounter < 150) { maxcounter = 200; // Send report if there is key pressed uint8_t const report_id = 0; uint8_t modifier = KEYBOARD_MODIFIER_LEFTGUI; uint8_t keycode[6] = { 0 }; keycode[0] = HID_KEY_L; usb_hid.keyboardReport(report_id, modifier, keycode); delay(10); // Un-press keys :) usb_hid.keyboardRelease(0); } // poll gpio once each 2 ms delay(20); // used to avoid send multiple consecutive zero report for keyboard static bool keyPressedPreviously = false; uint8_t count=0; uint8_t keycode[6] = { 0 }; // scan normal key and send report for(uint8_t i=0; i < pincount; i++) { if ( activeState == digitalRead(pins[i]) ) { // if pin is active (low), add its hid code to key report keycode[count++] = hidcode[i]; // 6 is max keycode per report if (count == 6) break; } } if ( TinyUSBDevice.suspended() && count ) { // Wake up host if we are in suspend mode // and REMOTE_WAKEUP feature is enabled by host TinyUSBDevice.remoteWakeup(); } // skip if hid is not ready e.g still transferring previous report if ( !usb_hid.ready() ) return; if ( count ) { // Send report if there is key pressed uint8_t const report_id = 0; uint8_t const modifier = 0; keyPressedPreviously = true; usb_hid.keyboardReport(report_id, modifier, keycode); }else { // Send All-zero report to indicate there is no keys pressed // Most of the time, it is, though we don't need to send zero report // every loop(), only a key is pressed in previous loop() if ( keyPressedPreviously ) { keyPressedPreviously = false; usb_hid.keyboardRelease(0); } } } // Output report callback for LED indicator such as Caplocks void hid_report_callback(uint8_t report_id, hid_report_type_t report_type, uint8_t const* buffer, uint16_t bufsize) { (void) report_id; (void) bufsize; }
Arduino Uno with Husky Lens using I2C
The HuskyLens is an easy-to-use AI machine vision sensor. It is equipped with multiple functions such as:
Via the UART / I2C port you can among others: boards connect:
Steps to take: Press Face detection, when a cross in a square is displayed, press the button on your HuskyLens
Set your husky protocol to I2C in the settings.
Minimal Code needed
/*************************************************** HUSKYLENS An Easy-to-use AI Machine Vision Sensor <https://www.dfrobot.com/product-1922.html> ****************************************************/ #include "HUSKYLENS.h" HUSKYLENS huskylens; //HUSKYLENS green line >> SDA; blue line >> SCL int ID0 = 0; //not learned results. Grey result on HUSKYLENS screen int ID1 = 1; //first learned results. colored result on HUSKYLENS screen int ID2 = 2; //second learned results. colored result on HUSKYLENS screen // and so on..... int arjprevious = 0; void printResult(HUSKYLENSResult result); void setup() { Serial.begin(115200); Wire.begin(); while (!huskylens.begin(Wire)) { Serial.println(F("Begin failed!")); Serial.println(F("1.Please recheck the \"Protocol Type\" in HUSKYLENS (General Settings>>Protocol Type>>I2C)")); Serial.println(F("2.Please recheck the connection.")); delay(100); } huskylens.writeAlgorithm(ALGORITHM_FACE_RECOGNITION); } void loop() { if (huskylens.requestLearned()) //request blocks and arrows tangged ID != 0 from HUSKYLENS if (huskylens.requestBlocksLearned()) //request blocks tangged ID != ID0 from HUSKYLENS { for (int i = 0; i < huskylens.countArrows(ID0); i++) { HUSKYLENSResult result = huskylens.getArrow(ID0, i); } int arj = huskylens.count(ID1); if ( arj != arjprevious ) { if ( arj == 1 ) { Serial.println("Learned face detected"); } else { Serial.println("Learned face not detected"); } arjprevious = arj; } } else { Serial.println("Fail to request objects from Huskylens!"); } }
Learned face detected ID1 Learned face not detected Learned face detected ID1 Learned face not detected Learned face detected ID1 Learned face not detected
I was working on a RP2040 HID project, but I needed some components I didn’t have … right now .. again ..
So I made something else ..
A tiny animator for stop motion animations using my webcam, python and OpenCV.
For claymotion or lego or whatever.
The program displays your webcam with the previous snapshot overlayed, so you can position everything relative to your previous snapshot.
Press B to take a frame.
CODE (short but you need OpenCV)
import cv2 from datetime import datetime # black is just a start empty image .. img=cv2.imread("black.png"); cap = cv2.VideoCapture(0) while True: ret,vid=cap.read() dim = (800,600) img1 = cv2.resize(img, dim, interpolation = cv2.INTER_AREA) vid1 = cv2.resize(vid, dim, interpolation = cv2.INTER_AREA) result=cv2.addWeighted(img1,0.5,vid1,0.5,0) cv2.imshow('overlay', result) if(cv2.waitKey(10) & 0xFF == ord('b')): now = datetime.now() current_time = now.strftime("%d_%m_%Y_%H_%M_%S") filename = '%s.png' % current_time if not cv2.imwrite(filename, vid1): raise Exception("Could not write image") img=cv2.imread(filename);
Pressing B fills your directory with PNG’s
like 24_10_2023_00_01_01.png (date formatted)
convert to GIF
convert -delay 10 -loop 0 24*.png animation.gif