Category Archives: Computer

Home Assistant ESPHome with toggle for interval

Posted because I could not find a good example on the interwebs.

Below creates a virtual HA button which toggles a blinking led.
(button and variables are called eprint for another function, change to something meaningful. )

Home Assistant virtual mqtt switch (configuration.yml)

See switch part

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
mqtt:
light:
- name: "KitchenOutside"
payload_on: "99"
payload_off: "0"
unique_id: "KitchenOutside"
brightness_scale: "99"
brightness_state_topic: ha433/kitchenoutside/brightcontrol
brightness_command_topic: ha433/kitchenoutside/brightcontrol
state_topic: ha433/kitchenoutside/brightcontrol
command_topic: ha433/kitchenoutside/control
optimistic: false
on_command_type: brightness
#-----8<-------------snip ########### EXAMPLES light and sensor
sensor:
- name: "LivingTemperature"
state_topic: "home/8461/payload"
unit_of_measurement: "°C"
value_template: "{{ value_json.svalue1 }}"
- name: "LivingHumidity"
state_topic: "home/8461/payload"
unit_of_measurement: "%"
value_template: "{{ value_json.svalue2 }}"
#--------8<--- snip ################################ ONLY PART BELOW NEEDED
switch:
unique_id: esphome_switch
name: "Esp Home Switch"
state_topic: "esphome/eprint/tmpstate"
command_topic: "esphome/eprint/state"
payload_on: "ON"
payload_off: "OFF"
state_on: "ON"
state_off: "OFF"
optimistic: false
qos: 0
retain: true
mqtt: light: - name: "KitchenOutside" payload_on: "99" payload_off: "0" unique_id: "KitchenOutside" brightness_scale: "99" brightness_state_topic: ha433/kitchenoutside/brightcontrol brightness_command_topic: ha433/kitchenoutside/brightcontrol state_topic: ha433/kitchenoutside/brightcontrol command_topic: ha433/kitchenoutside/control optimistic: false on_command_type: brightness #-----8<-------------snip ########### EXAMPLES light and sensor sensor: - name: "LivingTemperature" state_topic: "home/8461/payload" unit_of_measurement: "°C" value_template: "{{ value_json.svalue1 }}" - name: "LivingHumidity" state_topic: "home/8461/payload" unit_of_measurement: "%" value_template: "{{ value_json.svalue2 }}" #--------8<--- snip ################################ ONLY PART BELOW NEEDED switch: unique_id: esphome_switch name: "Esp Home Switch" state_topic: "esphome/eprint/tmpstate" command_topic: "esphome/eprint/state" payload_on: "ON" payload_off: "OFF" state_on: "ON" state_off: "OFF" optimistic: false qos: 0 retain: true
mqtt:
 light:    
  - name: "KitchenOutside"
    payload_on: "99"
    payload_off: "0"
    unique_id: "KitchenOutside"
    brightness_scale: "99"
    brightness_state_topic: ha433/kitchenoutside/brightcontrol
    brightness_command_topic: ha433/kitchenoutside/brightcontrol
    state_topic: ha433/kitchenoutside/brightcontrol
    command_topic: ha433/kitchenoutside/control
    optimistic: false
    on_command_type: brightness
#-----8<-------------snip ########### EXAMPLES light and sensor
 sensor:
  - name: "LivingTemperature"
    state_topic: "home/8461/payload"
    unit_of_measurement: "°C"
    value_template: "{{ value_json.svalue1 }}"
  - name: "LivingHumidity"
    state_topic: "home/8461/payload"
    unit_of_measurement: "%"
    value_template: "{{ value_json.svalue2 }}"
#--------8<--- snip ################################ ONLY PART BELOW NEEDED 
 switch:
    unique_id: esphome_switch
    name: "Esp Home Switch"
    state_topic: "esphome/eprint/tmpstate"
    command_topic: "esphome/eprint/state"
    payload_on: "ON"
    payload_off: "OFF"
    state_on: "ON"
    state_off: "OFF"
    optimistic: false
    qos: 0
    retain: true

ESP Home config for a ESP32

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
esphome:
name: lolin32litemqttled
friendly_name: lolin32litemqttled
esp32:
board: esp32dev
framework:
type: arduino
# Enable logging
logger:
# Enable Home Assistant API
api:
encryption:
key: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx="
ota:
password: "xxxxxxxxxxxxxxxxxxxxxxxx"
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
# Enable fallback hotspot (captive portal) in case wifi connection fails
ap:
ssid: "Lolin32Litemqttled"
password: "xxxxxxxxxxxxxxxxxxx"
captive_portal:
switch:
- platform: gpio
pin:
number: 22
mode: output
id: blueLED
- platform: template
name: "eprint"
id: eprint_enable
optimistic: on
interval:
- interval: 1000ms
then:
if:
condition:
switch.is_on: eprint_enable
then:
- switch.toggle: blueLED
mqtt:
broker: 192.168.1.2
on_message:
- topic: esphome/eprint/state
qos: 0
payload: "OFF"
then:
- switch.turn_off: eprint_enable
- topic: esphome/eprint/state
qos: 0
payload: "ON"
then:
- switch.turn_off: eprint_enable
esphome: name: lolin32litemqttled friendly_name: lolin32litemqttled esp32: board: esp32dev framework: type: arduino # Enable logging logger: # Enable Home Assistant API api: encryption: key: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=" ota: password: "xxxxxxxxxxxxxxxxxxxxxxxx" wifi: ssid: !secret wifi_ssid password: !secret wifi_password # Enable fallback hotspot (captive portal) in case wifi connection fails ap: ssid: "Lolin32Litemqttled" password: "xxxxxxxxxxxxxxxxxxx" captive_portal: switch: - platform: gpio pin: number: 22 mode: output id: blueLED - platform: template name: "eprint" id: eprint_enable optimistic: on interval: - interval: 1000ms then: if: condition: switch.is_on: eprint_enable then: - switch.toggle: blueLED mqtt: broker: 192.168.1.2 on_message: - topic: esphome/eprint/state qos: 0 payload: "OFF" then: - switch.turn_off: eprint_enable - topic: esphome/eprint/state qos: 0 payload: "ON" then: - switch.turn_off: eprint_enable
esphome:
  name: lolin32litemqttled
  friendly_name: lolin32litemqttled

esp32:
  board: esp32dev
  framework:
    type: arduino

# Enable logging
logger:

# Enable Home Assistant API
api:
  encryption:
    key: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx="

ota:
  password: "xxxxxxxxxxxxxxxxxxxxxxxx"

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Lolin32Litemqttled"
    password: "xxxxxxxxxxxxxxxxxxx"

captive_portal:
    
switch:
  - platform: gpio
    pin:
      number: 22
      mode: output
    id: blueLED
  - platform: template
    name: "eprint"
    id: eprint_enable
    optimistic: on

interval:
  - interval: 1000ms
    then:
      if:
        condition:
          switch.is_on: eprint_enable
        then:
          - switch.toggle: blueLED

mqtt:
  broker: 192.168.1.2
  on_message:
  - topic: esphome/eprint/state
    qos: 0
    payload: "OFF"
    then:
      - switch.turn_off: eprint_enable
  - topic: esphome/eprint/state
    qos: 0
    payload: "ON"
    then:
      - switch.turn_off: eprint_enable

A “new” sound chip for 6502

UPDATE: 20240225

I’ve written about General Instrument AY-3-8910 before, here is some work I did today.

This sound chip i wanted to implement in my amiga, and now it’s a alternative for my 6502 computer. ( As an alternative setup for the SID chip. )
Btw this is the same kind of chip used in the Atari ST.

A clean setup … I’ve got the sound chip and a Amplifier chip.

Above a Kicad drawing I made today, a little different from my design from the 90’s.

Below a movie clip I recorded today. Running a test setup using an Arduino nano and a sdcard reader.
The sound is bad, this is due to clipping and the absence of multiple resistors and capacitors.
Music is a register dump from a YM music file.
Amplifier is a bare LM386.

UPDATE: 20240225

I don’t like tying those three outputs together, and amplifying those.

So I’m going to use a LM324 i’ve got left from my 8085 interface, and make a 3-channel amplifier.

Something like this

Soldering a 6502 PCB

A while ago I started a soldering a 6502 bare SBC.

Note pin 1 is not connected, VPB (vector pull is not supported on this PCB. But i’m planning to design a new one anyway.)

I got it running now.

It has an EPROM with Wozmon and Basic for now.
I have to redo the address decoder, but I like the simple serial interface by Geoffrey. (I hate the PIC18F15Q41, made by Microchip, but still the best minimal option .. for now)

Probably the last time i’ve used a pic was in 1998

PL/M-86

I’ve posted in the past something about pl/m.
Today i got this running again in a dosbox.

The PL/M programming language (an acronym of Programming Language for Microcomputers) is a high-level language conceived and developed by Gary Kildall in 1973 for Intel’s microprocessors.

A link to information about Gary, and ebook (pdf) he wrote.

We learned to program PL/M at school (MTS)

Below the compiler and lib files

https://media.henriaanstoot.nl/plm86.zip

Example program Tic Tac Toe I wrote in 1990

Compiling a PLM source code

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
PLM86 PROGRAM.PLM
LINK86 PROGRAM.OBJ, PLM\DOSLIBS.LIB, PLM\UTILS.LIB TO %1.LNK INITCODE
LINK PROGRAM.LNK;;;
PLM86 PROGRAM.PLM LINK86 PROGRAM.OBJ, PLM\DOSLIBS.LIB, PLM\UTILS.LIB TO %1.LNK INITCODE LINK PROGRAM.LNK;;;
PLM86 PROGRAM.PLM
LINK86 PROGRAM.OBJ, PLM\DOSLIBS.LIB, PLM\UTILS.LIB TO %1.LNK INITCODE
LINK PROGRAM.LNK;;;

Tic Tac Toe in PLM

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
bke:do;
/*DOEL: */
/*Dit programma is boter kaas en eieren voor twee */
/*spelers, er wordt gecontroleerd of iemand gewonnen */
/*heeft. (Je speelt niet tegen de computer) */
/*UPDATE:12/2/90,15/2/90,18/2/90 RELDATE:19/2/90 */
/*PROGRAMMER:H.M.Aanstoot */
/*UPDATE 5/3/90 1:13:23 */
/*De volgende 4 regels zorgen ervoor dat de compiler */
/*de PLM DOS,UTIL routines die op disk staan */
/*meestuurt naar de linker */
/* bla bla 2de versie met STRINGS!! eindelijk gelukt */
$include(plm\doslibs.inc)
$include(plm\doslibs.dcl)
$include(plm\utils.dcl)
dcl naam(3) pointer;
dcl plaats(9) word;
dcl teken(2) pointer;
dcl aanzet word;
dcl loop word;
dcl a word;
dcl winnaar word;
dcl nummer word;
dcl item word;
dcl error_status word;
spelerzet:procedure;
call dsso(naam(aanzet));
call dsso(@(', geef een getal: $'));
invoer:
nummer=dsin;
nummer=nummer-48;
if nummer<1 or nummer>9 then goto invoer;
if plaats(nummer)<>0 then goto invoer;
call dso(nummer+48);
plaats(nummer)=aanzet;
end spelerzet;
update:procedure;
item=1;
call dsso(@(cr,lf,'+-----+-----+-----+',cr,lf,eos));
call dsso(@('| | | |',cr,lf,eos));
call dso(124);call zet;call dso(124);call zet;call dso(124);call zet;
call dsso(@(124,cr,lf,eos));
call dsso(@('| | | |',cr,lf,eos));
call dsso(@('+-----+-----+-----+',cr,lf,eos));
call dsso(@('| | | |',cr,lf,eos));
call dso(124);call zet;call dso(124);call zet;call dso(124);call zet;
call dsso(@(124,cr,lf,eos));
call dsso(@('| | | |',cr,lf,eos));
call dsso(@('+-----+-----+-----+',cr,lf,eos));
call dsso(@('| | | |',cr,lf,eos));
call dso(124);call zet;call dso(124);call zet;call dso(124);call zet;
call dsso(@(124,cr,lf,eos));
call dsso(@('| | | |',cr,lf,eos));
call dsso(@('+-----+-----+-----+',cr,lf,eos));
call dsso(@(' 1 2 3',cr,lf,eos));
call dsso(@(' 4 5 6',cr,lf,eos));
call dsso(@(' 7 8 9',cr,lf,eos));
end update;
zet:procedure;
if plaats(item)=0 then call dsso(@(' $'));
if plaats(item)=1 then call dsso(@(' X $'));
if plaats(item)=2 then call dsso(@(' O $'));
item=item+1;
end zet;
check:procedure;
do a=1 to 2;
if plaats(1)=a and plaats(2)=a and plaats(3)=a then winnaar=a;
if plaats(4)=a and plaats(5)=a and plaats(6)=a then winnaar=a;
if plaats(7)=a and plaats(8)=a and plaats(9)=a then winnaar=a;
if plaats(1)=a and plaats(4)=a and plaats(7)=a then winnaar=a;
if plaats(2)=a and plaats(5)=a and plaats(8)=a then winnaar=a;
if plaats(3)=a and plaats(6)=a and plaats(9)=a then winnaar=a;
if plaats(1)=a and plaats(5)=a and plaats(9)=a then winnaar=a;
if plaats(3)=a and plaats(5)=a and plaats(7)=a then winnaar=a;
end;
end check;
hoofdprogramma:
winnaar=3;
naam(1)=@('Speler 1$');
naam(2)=@('Speler 2$');
naam(3)=@('Niemand$');
do a=1 to 9; plaats(a)=0; end;
teken(1)=@('kruisje$');
teken(2)=@('rondje$');
aanzet=1;
do loop=1 to 9;
call update;
call check;
if winnaar<>3 then goto gewonnen;
call spelerzet;
aanzet=3-aanzet;
end;
call update;
gewonnen:
call dsso(naam(winnaar));
call dsso(@(' heeft gewonnen',cr,lf,eos));
if winnaar=3 then call dsso(@('Helaas, pindakaas!$'));
else call dsso(@('Gefeliciteerd ermee!$'));
call dexit(error_status);
end;
bke:do; /*DOEL: */ /*Dit programma is boter kaas en eieren voor twee */ /*spelers, er wordt gecontroleerd of iemand gewonnen */ /*heeft. (Je speelt niet tegen de computer) */ /*UPDATE:12/2/90,15/2/90,18/2/90 RELDATE:19/2/90 */ /*PROGRAMMER:H.M.Aanstoot */ /*UPDATE 5/3/90 1:13:23 */ /*De volgende 4 regels zorgen ervoor dat de compiler */ /*de PLM DOS,UTIL routines die op disk staan */ /*meestuurt naar de linker */ /* bla bla 2de versie met STRINGS!! eindelijk gelukt */ $include(plm\doslibs.inc) $include(plm\doslibs.dcl) $include(plm\utils.dcl) dcl naam(3) pointer; dcl plaats(9) word; dcl teken(2) pointer; dcl aanzet word; dcl loop word; dcl a word; dcl winnaar word; dcl nummer word; dcl item word; dcl error_status word; spelerzet:procedure; call dsso(naam(aanzet)); call dsso(@(', geef een getal: $')); invoer: nummer=dsin; nummer=nummer-48; if nummer<1 or nummer>9 then goto invoer; if plaats(nummer)<>0 then goto invoer; call dso(nummer+48); plaats(nummer)=aanzet; end spelerzet; update:procedure; item=1; call dsso(@(cr,lf,'+-----+-----+-----+',cr,lf,eos)); call dsso(@('| | | |',cr,lf,eos)); call dso(124);call zet;call dso(124);call zet;call dso(124);call zet; call dsso(@(124,cr,lf,eos)); call dsso(@('| | | |',cr,lf,eos)); call dsso(@('+-----+-----+-----+',cr,lf,eos)); call dsso(@('| | | |',cr,lf,eos)); call dso(124);call zet;call dso(124);call zet;call dso(124);call zet; call dsso(@(124,cr,lf,eos)); call dsso(@('| | | |',cr,lf,eos)); call dsso(@('+-----+-----+-----+',cr,lf,eos)); call dsso(@('| | | |',cr,lf,eos)); call dso(124);call zet;call dso(124);call zet;call dso(124);call zet; call dsso(@(124,cr,lf,eos)); call dsso(@('| | | |',cr,lf,eos)); call dsso(@('+-----+-----+-----+',cr,lf,eos)); call dsso(@(' 1 2 3',cr,lf,eos)); call dsso(@(' 4 5 6',cr,lf,eos)); call dsso(@(' 7 8 9',cr,lf,eos)); end update; zet:procedure; if plaats(item)=0 then call dsso(@(' $')); if plaats(item)=1 then call dsso(@(' X $')); if plaats(item)=2 then call dsso(@(' O $')); item=item+1; end zet; check:procedure; do a=1 to 2; if plaats(1)=a and plaats(2)=a and plaats(3)=a then winnaar=a; if plaats(4)=a and plaats(5)=a and plaats(6)=a then winnaar=a; if plaats(7)=a and plaats(8)=a and plaats(9)=a then winnaar=a; if plaats(1)=a and plaats(4)=a and plaats(7)=a then winnaar=a; if plaats(2)=a and plaats(5)=a and plaats(8)=a then winnaar=a; if plaats(3)=a and plaats(6)=a and plaats(9)=a then winnaar=a; if plaats(1)=a and plaats(5)=a and plaats(9)=a then winnaar=a; if plaats(3)=a and plaats(5)=a and plaats(7)=a then winnaar=a; end; end check; hoofdprogramma: winnaar=3; naam(1)=@('Speler 1$'); naam(2)=@('Speler 2$'); naam(3)=@('Niemand$'); do a=1 to 9; plaats(a)=0; end; teken(1)=@('kruisje$'); teken(2)=@('rondje$'); aanzet=1; do loop=1 to 9; call update; call check; if winnaar<>3 then goto gewonnen; call spelerzet; aanzet=3-aanzet; end; call update; gewonnen: call dsso(naam(winnaar)); call dsso(@(' heeft gewonnen',cr,lf,eos)); if winnaar=3 then call dsso(@('Helaas, pindakaas!$')); else call dsso(@('Gefeliciteerd ermee!$')); call dexit(error_status); end;
bke:do;
/*DOEL:                                              */
/*Dit programma is boter kaas en eieren voor twee    */
/*spelers, er wordt gecontroleerd of iemand gewonnen */
/*heeft. (Je speelt niet tegen de computer)          */
/*UPDATE:12/2/90,15/2/90,18/2/90  RELDATE:19/2/90    */
/*PROGRAMMER:H.M.Aanstoot                            */
/*UPDATE 5/3/90 1:13:23                              */
/*De volgende 4 regels zorgen ervoor dat de compiler */
/*de PLM  DOS,UTIL routines die op disk staan        */
/*meestuurt naar de linker                           */
/* bla bla 2de versie met STRINGS!! eindelijk gelukt */

$include(plm\doslibs.inc)
$include(plm\doslibs.dcl)
$include(plm\utils.dcl)
dcl naam(3)           pointer;
dcl plaats(9)         word;
dcl teken(2)          pointer;
dcl aanzet            word;
dcl loop              word;
dcl a                 word;
dcl winnaar           word;
dcl nummer            word;
dcl item              word;
dcl error_status      word;

spelerzet:procedure;
call dsso(naam(aanzet));
call dsso(@(', geef een getal: $'));
invoer:
nummer=dsin;
nummer=nummer-48;
if nummer<1 or nummer>9 then goto invoer;
if plaats(nummer)<>0 then goto invoer;
call dso(nummer+48);
plaats(nummer)=aanzet;
end spelerzet;

update:procedure;
item=1;
call dsso(@(cr,lf,'+-----+-----+-----+',cr,lf,eos));
call dsso(@('|     |     |     |',cr,lf,eos));
call dso(124);call zet;call dso(124);call zet;call dso(124);call zet;
 call dsso(@(124,cr,lf,eos));
call dsso(@('|     |     |     |',cr,lf,eos));
call dsso(@('+-----+-----+-----+',cr,lf,eos));
call dsso(@('|     |     |     |',cr,lf,eos));
call dso(124);call zet;call dso(124);call zet;call dso(124);call zet;
 call dsso(@(124,cr,lf,eos));
call dsso(@('|     |     |     |',cr,lf,eos));
call dsso(@('+-----+-----+-----+',cr,lf,eos));
call dsso(@('|     |     |     |',cr,lf,eos));
call dso(124);call zet;call dso(124);call zet;call dso(124);call zet;
 call dsso(@(124,cr,lf,eos));
call dsso(@('|     |     |     |',cr,lf,eos));
call dsso(@('+-----+-----+-----+',cr,lf,eos));

  call dsso(@('    1   2   3',cr,lf,eos));
  call dsso(@('    4   5   6',cr,lf,eos));
  call dsso(@('    7   8   9',cr,lf,eos));
end update;


zet:procedure;
if plaats(item)=0 then call dsso(@('     $'));
if plaats(item)=1 then call dsso(@('  X  $'));
if plaats(item)=2 then call dsso(@('  O  $'));
item=item+1;
end zet;

check:procedure;
   do a=1 to 2;
   if plaats(1)=a and plaats(2)=a and plaats(3)=a then winnaar=a;
   if plaats(4)=a and plaats(5)=a and plaats(6)=a then winnaar=a;
   if plaats(7)=a and plaats(8)=a and plaats(9)=a then winnaar=a;

   if plaats(1)=a and plaats(4)=a and plaats(7)=a then winnaar=a;
   if plaats(2)=a and plaats(5)=a and plaats(8)=a then winnaar=a;
   if plaats(3)=a and plaats(6)=a and plaats(9)=a then winnaar=a;

   if plaats(1)=a and plaats(5)=a and plaats(9)=a then winnaar=a;
   if plaats(3)=a and plaats(5)=a and plaats(7)=a then winnaar=a;
   end;
end check;


hoofdprogramma:
winnaar=3;
naam(1)=@('Speler 1$');
naam(2)=@('Speler 2$');
naam(3)=@('Niemand$');
do a=1 to 9; plaats(a)=0; end;
teken(1)=@('kruisje$');
teken(2)=@('rondje$');
aanzet=1;

    do loop=1 to 9;
    call update;
    call check;
    if winnaar<>3 then goto gewonnen;
    call spelerzet;
    aanzet=3-aanzet;
    end;
    
call update;
gewonnen:
call dsso(naam(winnaar));
call dsso(@(' heeft gewonnen',cr,lf,eos));
if winnaar=3 then call dsso(@('Helaas, pindakaas!$'));
			 else call dsso(@('Gefeliciteerd ermee!$'));

call dexit(error_status);
end;

Raspberry – Arduino Collection

Display case almost done.

Raspberry 1-3 different versions RP400, compute module, zero’s, pico, RP2040 (trinkey). (2012-2023)

I’ve got to many arduino clones, so only atmeta328p, uno, mega, nano ..
And a esp32 esp8066 plus a wemos mini (i use these a lot)

The Arduino’s will have to make place for other Raspberry stuff at a later time.

Custom made case with acrylic protection cover.

These all work, so this is also my stock.
When needed for a project, I will have some spares.

Went to HCC Retro Meeting. (SDK-85 Update)

UPDATE 20240104

I’ve met Dirk, he brought his SDK85.
And demo-ed a working cassette interface, using audio cables and a second laptop.

Saw a presentation about the MC14500B a weird little chip, robots, retro rebuilds using Raspberries.

Update 20240104 some soldering

Meanwhile .. my old MicroTapes are not using the Intel AP-29 method for data, so that needs some work also.

Raspberry Pi History Case

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

Case with some Raspberries and Arduino’s I found lying around, I’m not going to dismantle projects. Only the RPi 1A, 4B, Zero, Zero W, Pico and RPi 400 are displayed.
Plastic sheet as protective layer still on there, should be clear as glass.

The case isn’t glued together yet. I’m not sure how and what to include.

  • Horizontal wooden bars to place the devices on?
  • Include a history of Arduino’s for now?
  • Put little notes in the case with information? Like my SDK-85 case?
  • ?

Get information about your RPi version

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
curl -L https://perturb.org/rpi?rev=$(awk '/^Revision/ { print $3 }' /proc/cpuinfo)
curl -L https://perturb.org/rpi?rev=$(awk '/^Revision/ { print $3 }' /proc/cpuinfo)
curl -L https://perturb.org/rpi?rev=$(awk '/^Revision/ { print $3 }' /proc/cpuinfo)

SDK-85 interface PCB soldered

Using spacers, I can use the existing holes in the SDK to hold the interface PCB in place. Now I have to move my information sheet. 🙂

My scope didn’t save the test capture .. Next time.
But I could see the clear ones and zeros.

You can faintly see the data, stop start of a program is visible.

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.

Micropython Pico W Internal Led Test

  • Download firmware from here (uf2 file)
    https://micropython.org/download/RPI_PICO_W/
    (Make sure you use W version if you have a pico-w)
  • Press bootsel and plug your pico into an usb port.
  • A folder should be accessible
  • cp RPI_PICO_W-20231005-v1.21.0.uf2 /media/$USER/RPI-RP2/
    (pico reboots and installs firmware)

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.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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)
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)
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

Ultrasonic Sensor HC-SR04 + RP2040 (waveshare) Auto screen lock

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

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
#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;
}
#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; }
#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;

}