Sometimes when i’m writing code i want to know what’s happening. For example when i’m working on the display, there is maybe no output. With the above example i can write to address $01F0 (example address), and it will display on the 7 Segment displays.
Upperleft PLD is my address decoder, which has been running for a while now.
Secondary PLD adds the rest of the Addressbus lines, and gives me the opportunity to select in a range of 16 addresses, using jumpers/
The two smaller PLD’s latch the databus data when addressed. AND decodes a nibble to 7-Segment output for 0-9A-F. (There are apparently no chips available which do A-F)
I’m going to add the PLD code when everything works. Let me know if you like the idea.
Last year i was playing with this radar module also, but today i made a version with MQTT and a linux client. (There is a project on the internet which uses a HC-SR04, and a arduino connected to the Laptop. This setup is more sensitive and no need for a usb thinghy.)
HC-SR04 module (ultrasound)
Last years version, using a micro transformer and a ESP-12
When using MQTT i can integrate this in HomeAssistant, Domoticz, NodeRed and more. But i’ve written a python script which runs on my Laptop. For example i can: Kill vlc, change to my work desktop, stop sound output and lock the screen. (everything you can script)
I wanted to have a “mobile” version of the sensor so i can place it anywhere. (Frontdoor, gardengate, candydrawer 🙂 )
These modules are very cheap, but do their job well!
I’ve used a Wroom ESP32 and a BattBorg together with the module, that’s it.
Below shows the speed of detection, and sending though the network
Python script which does a lock-screen using XDOTOOL
from paho.mqtt import client as mqtt_client
import subprocess
import time
broker = 'MQTT-SERVER'
port = 1883
topic = "radar/state"
client_id = "radarclient"
def connect_mqtt() -> mqtt_client:
def on_connect(client, userdata, flags, rc):
if rc == 0:
print("Connected to MQTT Broker!")
else:
print("Failed to connect, return code %d\n", rc)
client = mqtt_client.Client(client_id)
client.on_connect = on_connect
client.connect(broker, port)
return client
def subscribe(client: mqtt_client):
def on_message(client, userdata, msg):
state = msg.payload.decode()
print (state)
if state == "1":
subprocess.Popen(["xdotool","key","Super_L+l"])
time.sleep(30)
client.subscribe(topic)
client.on_message = on_message
def run():
client = connect_mqtt()
subscribe(client)
client.loop_forever()
if __name__ == '__main__':
run()
change subprocess.Popen([“xdotool”,”key”,”Super_L+l”]) into subprocess.Popen([“switchdesktop”]) to run a script named switchdesktop
#!/bin/bash
# This is the switchdesktop script, it goes to the next screen using winows-page-down combo
xdotool key "Super_L+Page_Down"
Todo:
3D print a case Make a version which becomes a Access Point. Then make another arduino setup which controls my Nikon. So it can act like a wildcam (offline)
Something like below, using a optocoupler ( i still got some leftovers from my doorbell to gpio-pin project.)
The cyanotype (from Ancient Greek kuáneos, “dark blue” and túpos, “mark, impression, type”) is a slow-reacting, photographic printing technique. It produces a cyan-blue print used for art as monochrome imagery applicable on a range of supports, and for reprography in the form of blueprints. For any purpose, the process usually uses two chemicals: ferric ammonium citrate or ferric ammonium oxalate, and potassium ferricyanide, and only water to develop and fix. Announced in 1842, it is still in use.
This technique was also used as a method of copying drawings. For example buildings and schematics. While making copies of drawings with the exact dimensions of the original, making the result untemperable was another big plus. ( You could not move/redraw walls for example on the copy)
I’ve printed a photo on transparant sheets to experiment with. (Next time, i’ll take a larger size, and fix the contrast.
The most interesting ones i’ve made today:
Transparant sheetsDots are made by spraying alcoholDetail of picture left
No more sync issues! (see post https://www.henriaanstoot.nl/2022/10/19/composite-video-with-atmega328p/ )
There are some duplicate characters, the input device below does not have a proper debounce method.
My temporary input device (note hex 21 is a “!” character)
No need to fix the debounce, the dipswitches are temporary. This will be controlled by the VIA 6522 chip.
UPDATE 20221108 (Connected to second VIA)
PORTB = $5000
PORTA = $5001
DDRB = $5002
DDRA = $5003
clock = $e0
E = %10000000
RW = %01000000
RS = %00000000
.org $0200
reset:
ldx #$ff
txs
lda #%11111111 ; Set all pins on port B to output
sta DDRB
lda #%10000000 ; Set top pin on port A to output
sta DDRA
lda #$00 ; reset bit
sta PORTA
sta clock
ldx #0
print:
lda message,x
beq printborder
jsr print_char
inx
jmp print
loop:
jmp loop
message:
.db 0x01,0x04,0x0C,0x0E,0x10,0x0F,0x08
.db 0x05,0x0a,0x0a
.db 0x05,0x0b,0x0b
.asc "Composite Video 6502 - 20221108"
.db 0x0E,0x11,0x0F,0x0C
.asciiz " With 2 pixels "
waitloop:
pha
tya
pha
ldy #$ff
back:
dey
bne back
pla
tay
pla
rts
print_char:
sta PORTB
jsr waitloop
jsr waitloop
lda clock
eor #%10000000
sta clock
sta PORTA
jsr waitloop
lda clock
eor #%10000000
sta PORTA
jsr waitloop
rts
Control codes as from : http://searle.x10host.com/MonitorKeyboard/index.html
Video display control codes:
Hex (Decimal) and meaning
01 (01) - Cursor home (Standard ASCII)
02 (02) - Define cursor character (2nd byte is the curs character, or 00 to turn off) <--New for 3.0
03 (03) - Cursor blinking
04 (04) - Cursor solid
05 (05) - Set graphics pixel (next two bytes = x,y) <--New for 3.0
06 (06) - Reset graphics pixel (next two bytes = x,y) <--New for 3.0
08 (08) - Backspace (Standard ASCII)
09 (09) - Tab (Standard ASCII)
0A (11) - Linefeed (Standard ASCII)
0C (12) - Clear screen (Standard ASCII)
0D (13) - Carriage return (Standard ASCII)
0E (14) - Set column 0 to 79 (2nd byte is the column number) or 0 to 39 for a 40 char line
0F (16) - Set row 0 to 24 (2nd byte is the row number)
10 (16) - Delete start of line
11 (17) - Delete to end of line
12 (18) - Delete to start of screen
13 (19) - Delete to end of screen
14 (20) - Scroll up
15 (21) - Scroll down
16 (22) - Scroll left
17 (23) - Scroll right
18 (24) - Set font attribute for the current line (see elsewhere on this page for details) <--New for 3.0
1A (26) - Treat next byte as a character (to allow PC DOS char codes 1 to 31 to be displayed on screen)
1B (27) - ESC - reserved for ANSI sequences
1C (28) - Cursor right
1D (29) - Cursor Left
1E (30) - Cursor up
1F (31) - Cursor down
20 (32) to 7E (126) - Standard ASCII codes
7F (127) - Delete
80 (128) to FF (255) - PC (DOS) extended characters
I’m using a windows program for typesetting bagpipe music. Luckily this runs on Linux using wine.
Sometimes i just want a PDF version of a tune, for example for my tunebook compiler. (Other post) Or i want to batch convert a lot of bww files.
A long time ago i used a virtual machine with automation software for this. Why not automate the process on my Laptop?
So i made this script, with a workaround for the xdotool wine problem. (wine window needs to be active to accept key strokes, other linux xwindows you can use the ID of the window)
#!/bin/bash
# use c for close at the end, without c bgplayer wont be shut down
# bww2pdf path/to/music.bww c
# make tmp file
cat "$1" > /tmp/deze.bww
# start bgplayer if not started .. if not started wait 3 secs
slp=0
pgrep BGPlayer.exe >/dev/null || slp=3
pgrep BGPlayer.exe >/dev/null|| ( nohup wine ~/.wine/dosdevices/c\:/Program\ Files\ \(x86\)/Bagpipe\ Player/BGPlayer.exe & )
sleep $slp
# get program id
pid=$(pgrep BGPlayer.exe)
# get xwindow id using pid
winid=$(xdotool search --limit 1 --all --pid $pid)
# activate window
xdotool search --desktop 0 --class "BGPlayer.exe" windowactivate
# open file menu and Open file
xdotool key --window $winid "alt+f"
xdotool key --window $winid "o"
# give program time to execute
sleep 1
# open our tmp file
xdotool type '\tmp\deze.bww'
xdotool key KP_Enter
sleep 2
# open file menu select Print and PDF as output
xdotool key "alt+f"
xdotool key "p"
xdotool key "P"
sleep 2
# execute
xdotool key KP_Enter
sleep 1
# File close
xdotool key "alt+f"
xdotool key "c"
sleep 2
# close program when c was added to commandline
mv ~/PDF/deze* "$1.pdf"
if [ "$2" == "c" ] ; then
xdotool key "alt+f"
xdotool key "x"
fi
I’m not touching the keyboard when the program is running, all handled by the script
Getting 433Mhz dimmers working under HA is a pain in the *ss.
After moving my Rfxcom from domoticz to HA, there was still no good way to add dimmers. I’ve tried adding switches and migrating them to lights, but it didn’t work.
So i took another approach.
Domoticz has a good 433 to mqtt plugin. So i used NodeRed to talk to HA and Domoticz via MQTT.
I use a bunch of different tools to create video’s or stream stuff. Below is some info about those tools.
Software:
Kdenlive – Linear video editor (Adding text, transitions, etc)
VLC media player – For example to embed video in OBS
OBS – Opensource Broadcast software, i use this also to record my screen – You can use this as a virtual webcam, so you can fool around with the image.
Audacity – For editing audio
QPrompt – Teleprompter
For OBS i made a shortcut/macro keyboard thingy. Based on an arduino pro mini. (Which can connect to a computer acting like a HID, for example a keyboard or mouse) I use this one to emulate keystrokes which i’ve configured in OBS to do:
Switch to scene 1
Switch to scene 2
Transition from scene to scene
Start streaming
Start recording
Mute
[empty] – sometimes used as “start virtual webcam”
Slow transition
Blank screen
Display overlay text
(Originally i planned to do this with a Nextion Display)
Mobile Phone holder, like a third hand
Sometimes a Nikon on a tripod is better.
Chromakey / Green screenPortable versionGreen screens .. loads of funVideo grabbers
I don’t have a dedicated webcam for my battlestation. So i mainly use a Actioncam (4k) which can be connected via USB. Or i use a Nikon together with the Camlink.
So i record using my mobile, webcam, screen record Edit using Audacity and Kdenlive.
When recording with OBS i use MP4 as a container, this is a no-brainer to embed in websites. Use mkv when recording long shots, or when connections can break. (A mp4 will be corrupted)