Saw a cool game a while ago, and found some old code. There was no schematic, so I had to reverse engineer it using the Arduino code. This one uses a Micro Pro.
Build a working version, now I can use this as base to create other games. But first i’m going to rebuild it so it can use Wifi and uses a Lipo Battery. Making it usable without wires.
Rotary – set angle/speed (Press resets)
Blue – toggle angle or speed ( was rotary press )
Green – select digit to change
Red – Fire
Led – not completely working yet, shows color of player Wil be changed to addressable leds with more functions (Player color, energy warning and more)
Last week I bought an old Bornhack Badge. I thought it needed a display.
Using a SSD1306 display, and Circuitpython I made this.
( Wooded thingy contains an RFID chip ( Part of my player ))
Library and files needed:
font5x8.bin in root of filesystem ( just google for this file )
copy of adafruit_framebuf.mpy in /lib
copy of adafruit_ssd1306.mpy in /lib
Code: (midway some pixel examples, just uncomment)
import board
from time import sleep
import busio
from PN7150 import PN7150
import adafruit_ssd1306
import math
import adafruit_framebuf
if True:
# Fast 400KHz I2C
i2c = busio.I2C(board.SCL, board.SDA, frequency = 400000)
else:
# Regular 100kHz I2C
i2c = board.I2C()
WIDTH = 32
HEIGHT = 8
buffer = bytearray(round(WIDTH * math.ceil(HEIGHT / 8)))
fb = adafruit_framebuf.FrameBuffer(
buffer, WIDTH, HEIGHT, buf_format=adafruit_framebuf.MVLSB
)
nfc = PN7150(i2c, board.IRQ, board.VEN)
display = adafruit_ssd1306.SSD1306_I2C(128, 32, i2c,addr=0x3c)
assert nfc.connect()
print("Connected.")
assert nfc.modeRW()
print("Switched to read/write mode.")
display.fill(0)
display.show()
#display.fill(0)
#display.text('Hello', 0, 0, 1 )
#display.text('World', 0, 10, 1)
#display.show()
# Set a pixel in the origin 0,0 position.
#display.pixel(0, 0, 1)
# Set a pixel in the middle 64, 16 position.
#display.pixel(64, 16, 1)
# Set a pixel in the opposite 127, 31 position.
#display.pixel(127, 31, 1)
#display.show()
while True:
display.fill(0)
display.text('Waiting for card', 0, 0, 1 )
display.show()
assert nfc.startDiscoveryRW()
print("Waiting for card..")
card = nfc.waitForCard()
assert nfc.stopDiscovery()
print("ID: {}".format(card.nfcid1()))
id = card.nfcid1()
display.text(id, 0, 10, 1 )
display.show()
sleep(0.5)
Not sure about display i2c address? Use below code
import time
import board
import busio
# List of potential I2C busses
ALL_I2C = ("board.I2C()",)
# Determine which busses are valid
found_i2c = []
for name in ALL_I2C:
try:
print("Checking {}...".format(name), end="")
bus = eval(name)
bus.unlock()
found_i2c.append((name, bus))
print("ADDED.")
except Exception as e:
print("SKIPPED:", e)
# Scan valid busses
if len(found_i2c):
print("-" * 40)
print("I2C SCAN")
print("-" * 40)
while True:
for bus_info in found_i2c:
name = bus_info[0]
bus = bus_info[1]
while not bus.try_lock():
pass
print(
name,
"addresses found:",
[hex(device_address) for device_address in bus.scan()],
)
bus.unlock()
time.sleep(2)
else:
print("No valid I2C bus found.")
I’ve connected the rotary encoder directly to the zero. Although many websites state that you need pull-up resistors, there is no need. Just use the internal pull-up resistors in the Pi.
Example code
GPIO.setmode(GPIO.BCM) # Use BCM mode
GPIO.setup(self.24, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(self.25, GPIO.IN, pull_up_down=GPIO.PUD_UP)
NOTE: Between 24 and 25 is a GND connection
Besides USB HID below XT, C64 and Amiga connectors will be emulated
Testing the first keyboard. It is the 8085-SDK hex matrix keyboard.
It is running on a Raspberry Pi Zero 2, without X server. So the images are displayed using the framebuffer. Also the touch data is read using evdev and the raw devices.
Todo:
HID part
Add a rotary button for the selection of the different Keyboard Layouts
Improvement keyboard matrix calculation to find out which key is being pressed.
Code to control AT/PS2 computers directly using GPIO pins
Add a controller to use Raw controlling of matrix pins ( 6502 C64 hardware for example )
import select
from math import floor
import sys
slot = 0
keysname=[["F","E","D","C","vect-int","reset"],
["B","A","9","8","GO","Single-Step"],
["7","6","5","4","Exam-reg","Subst-mem"],
["3","2","1","0","Exec","Next"],
]
keysnames=[["F","E","D","C","vect-int","reset"],
["B","A","L","H","GO","Single-Step"],
["PCL","PCH","SPL","SPH","Exam-reg","Subst-mem"],
["3","2","1","0",".",","],
]
for path in evdev.list_devices():
device = evdev.InputDevice(path)
if evdev.ecodes.EV_ABS in device.capabilities():
break
else:
sys.stderr.write('Failed to find the touchscreen.\n')
sys.exit(1)
while True:
r, w, x = select.select([device.fd], [], [])
id_ = -1
x = y = 0
for event in device.read():
if event.code == event.value == 0:
if id_ != -1:
yy = floor(( x - 600 ) / 700)
xx = floor(( y - 1377 ) / 226)
if yy < 4 and yy >=0 and xx < 6 and xx >= 00:
if slot == 1:
print(keysnames[yy][xx])
else:
print(keysname[yy][xx])
elif event.code == ABS_MT_TRACKING_ID:
id_ = event.value
elif event.code == ABS_MT_SLOT:
slot = event.value
elif event.code == ABS_MT_POSITION_X:
x = event.value
elif event.code == ABS_MT_POSITION_Y:
y = event.value
I came up with a simple matrix calculation
Pressing the 4 corner keys gave me x and y. I took averages for min and max reading. I don’t need pixel-perfect reading, and I noticed values between 960 and 3080 vertically. We want 960 – 3080 into 4 blocks, but the middle should start @ 960.
So 3080/3 = about 700 700 / 2 = 350 block 1 starts 350 sooner than 960 is ~ 600 Upper key y coords = 600-> + 700 Next is 1300 -> + 700 converting to whole numbers using floor gives me: floor(( y – 600 ) / 700) NOTE: My x and y are rotated
Example using coordinates 1600, 1600 floor(( 1600 – 600 ) / 700) = floor(1,4…) = 1st row (from row 0,1,2,3)
I’ve been busy programming Python and NodeRed for a client. But these are the things I’ve done in the last days.
C64 Assembly: Breaking borders, using sprites and multicolor font intro.
It does not look impressive, but I’ve learned a lot. Found a new way (for me) to open borders and change border colours on predefined raster lines. Sources will be posted.
KiCad tutorial, posted on YT also because I could not find many resources about the subject online. Maybe it’s helpful
Video editing using Kdenlive.
Edit: Even faster, use Netlabels, no need to join pins. Press L (uppercase) select pin 1, name 1. Press and hold insert until all pins named. Copy paste socket 5 times and goto your PCB tab.
This movie is about creating a backplane for a 6502 SBC I’m building. It is real-time and below 4 minutes.
Multi Keyboard
My small multitouch screen came in. This is for my previously mentioned multi-computer case.
It is going to show multiple keyboard layouts for different systems. (See previous posts about this)
Waveshare display, Raspberry Zero as HID device, using USB and pin emulated keyboards. (c64 matrix, AT (DIN) keyboard, ps2 keyboard)
Some example screens
Vic-20
Photo-realistic
Petscii C64
Another C64
I’m also going to make a layout like the keyboards on my 8085
GameA masm setupExample asm program to see gfx capabilities
68000 Progress
My address decoder seems to work (using an ATF22v10C) See previous posts.
Also new Rom and Ram chips. These are 8 bits, but the 68000’s data bus we need two (Odd and Even Addresses)
C64 Hacks
I made a proof of concept for a Rom switcher. 8 Different Roms can be selected using the dip switches. (Dipswitches are being replaces bij something smarter in the future, like an Arduino Nano (like Adrian Black’s solution)
PROCESSOR FUNCTION CODES (FC0, FC1, FC2) These function code outputs indicate the mode (user or supervisor) and the address space type currently being accessed.
The following table shows the
meaning of these three bits.
FC2 FC1 FC0 Meaning
0 0 0 Not used
0 0 1 User data
0 1 0 User program
0 1 1 Not used
1 0 0 Not used
1 0 1 Supervisor data
1 1 0 Supervisor program
1 1 1 Interrupt Acknowledge
These outputs can therefore inform external circuitry what is happening
inside the 68000. They could, for example, be used to switch in differentbanks of memory.
Using a small 8266 with a display, I wanted to see if it’s useful to monitor this information.
So using a trick with the uln2804/uln2803 as level convertor (don’t connect the VCC, and the output will drop to a level that is around the 3.3v. (I was out of bi-directional level convertors)
Latch demo
I’ve been using latches in the past, but I wanted to show how it works using a little demo setup. Below movie is for the Bus Controller I posted recently.