Related lists

Description

Thinking back to the early personal computers, you started with an expensive processing unit and add an analog monitor (or even a TV set), cassette recorder, and a bulky keyboard... but with this badge everything fits in the palm of your hand. It includes a mini keyboard with mechanical buttons, TFT LCD color display, small speaker, flash memory for program storage and two AA batteries for tens of hours of operation.
New for the Supercon is a convenient proto-board which connects to your computer and lets you create your own expansion peripherals, including multiple shitty add-ons, standardized by Brian Benchoff.
Firmware is a masterpiece of Jaromir Sukuba, who will be among your hosts on the conference.

Details

All ticketed attendees of the 2018 Hackaday Superconference will receive one of these incredible badges. We're excited to see what three days of badge hacking will produce! Join us in Pasadena on November 2-4!

Files

Bezel which should be glued to the back of the bezel, to protect components from your fingers. The best material is transparent acrylic, 4 or 5 mm thick. This file is in CorelDraw Version 11, which is compatible with most laser cutters.

Project Logs

The Hackaday BASIC interpreter is based on the uBASIC project by Adam Dunkels. This provided a tokenizer and the most rudimentary words needed for the language to operate. From there, Jaromir Sukuba greatly expanded the word set to take advantage of the best the badge hardware has to offer.

We are also testing out an advancement in the tokenizer written by @ziggurat29 which shows a speed-up of as much as 40x!

The reference for all of the words is listed below. You may also see examples of these words in use by viewing the example code project log.

Of Note:

Code in the program buffer can be viewed one page at a time by typing more. You can overwrite lines just by typing the line number at the prompt along with your new commands. It is recommended that you number every 10 lines or more so that you can add commands in between them as you develop your code.

The memclr word will clear the code currently in the program buffer.

Always save before running in case you have to reset the badge. save 0 will save to the first of 16 slots, load 0 will load the saved code.

Press the BRK key to break out of a running program

Typing a line number without anything after it will delete that line from your program

There are two print commands. print will not include a line feed, println will include a line feed

This badge has a built-in speaker and you can compose music for 3 voices using a simple scripting language. Use the BASIC interpreter to access these features with the syntax:

tune voice1,voice2,voice3,duration

Duration is the number of milliseconds this chord should be held. The voice values use Scientific Pitch Notation (https://hac.io/hGf7) where middle C is 60. Do a C major chord held for 1 second would look like this tune 60,64,67,1000 -- below is a cheat sheet.

PRO TIP: Remember BASIC programs can be saved in any of 16 slots (0..15) using the save/load commands.

As an example, try typing this into your BASIC interpreter (you may want to type memclr before you start, to clear any existing code):

Badge to Badge

Remember those TI graphic calculators that had a cable to transfer programs? The badges can work in the same way.

Connect the GND pins on the expansion header.

Connect C14<-->C13 and C13<-->C14 on the two badges.

On receiving badge type "sload" and it will wait for program to arrive

On sending badge type "ssave". Program will be sent. Receiving badge will report 1 byte more than sending badge to indicate the zero terminator

Type list on receiving badge to see new code in the program buffer.

IMPORTANT TIP: If the receiving badge doesn't react, reset that badge (shift-reset) and try again. Sometimes this is necessary after first connecting the cables.

Computer-to-Badge

A serial-to-TTL cable will allow you to communicate between the badge and a computer. If you own one of this cables we highly recommend you bring it with you! We will have cables on hand but it will be necessary to share them so extras are great!

Wiring Diagram:

Badge Pin Ground (GND) --> Ground on serial cable

Badge Pin TX (C14) --> RX on serial cable (White in this example)

Badge Pin RX (C13) --> TX on serial cable (Green in this example)

Important: Leave voltage disconnected (Red in this example)

Serial Connection Info:

Baud: 19200 8N1

In basic, use command ssave to send program buffer as string

In BASIC, use command sload to recieve string into buffer

CP/M includes xmodem. Check your computer's serial program to ensure it supports this protocol. In the Z80 Emulator, switch to b: drive and run command similar to this: xmdm r d:FILENAME.EXT

Linux: Simple Instructions for Transferring BASIC Programs

This quick walkthrough assumes that USB to TTL serial cable will enumerate as /dev/ttyUSB0. Look at dmesg output after plugging cable to ensure this is true.

Setup simple Linux serial connection:

Use dmesg and look for where the serial cable is mounted -- this example assumes /dev/ttyUSB0. It then sets permissions to that mounting point, sets the serial parameters to a "sane" value, and configures the port as needed. When in doubt, power cycle your badge and try again.

Install the peripheral libraries next. IMPORTANT: You must specify the same directory as the XC32 compiler. This will likely not be the default option during install. For Linux installation this director was: /opt/microchip/xc32/v2.10/

Install MPLABX IDE

Open the MPLABX project from this repository

A PIC programmer like the PICKIT3 is required to program your badge

On the PIC programmer, pins 1-5 correspond to RES, V+, GND, B0, and B1 on the badge

When directly controlling the screen, you will want to perform a screen refresh after badge wakes up from sleep

There is function pointer in hw.h that will call your screen refresh function on wake. Here is the example for setting which function will be executed (do this in the initialization function of your program):

These pins can be controlled from BASIC using the edir, ein, and eout commands. The UART on pins C13 and C14 can be accessed from BASIC using uin and uout commands.

G2 and G3 are 5V tolerant but all other pins should be interfaced at 3V.

Important: there is no voltage regulation on the badge, and the PIC32 datasheet lists maximum Vdd of 3.6. Keep this in mind if upgrading power supply beyond a pair of AA batteries. (A fully charged lithium ion battery tops out at 4.2V.)

Expansion Board

New for the Hackaday Supercon is a hardware expansion board for prototyping your own circuits. Pictured here is the prototype. The final design will be black, and it will include three headers for #Shitty Add-Ons

To the right there will be a mounting hole so that the expansion board can be firmly affixed to your badge.

Here is the front view (red) and rear view (green) of the circuitry for the expansion board. Here is the list of package footprints available:

3 × Shitty Add-On headers

1 × SO-8

1 × SO-16

1 × TSSOP-16

2 × SOT-23 (for SMD transistors)

14 × 0805 (for SMD passive components)

1 × LGA-16 (for accelerometer only)

All round pads are general purpose pads, and square ones are connected and intended for special use. The following drawing contains color marking for those pads, so the black pads are Ground (0V) connection, red pads are for +3V supply, green ones are I2C Clock pads, and blue ones are I2C Data pads. They are arranged so that you can use up to three shitty-add-on connectors without any modification of the PCB.

Pull-Up Resistor Footprints for I2C

If you plan to use I2C (for your own circuit or for a shitty-add-on), pull-up resistors must be added. Please note that there are no pull-up resistors for the I2C bus on the main board, so you should add 4K7 (or similar) pull-up resistors on the noted 0805 footprints at the column "t", rows 4-5 and 6-7. Those 0805 footprints are marked as DA (data) and CK (clock).

Adding an Accelerometer

If you add an LIS3 accelerometer to your expansion board, it is highly recommended to add the ceramic capacitor at the column "q", rows 4-5. Its capacitance should be 4.7 to (preferably) 10 µF.

Pin 1 of the accelerometer is at the bottom left. Only LIS3DH or LIS3DE accelerometers can be used, as the pads on the LGA-16 footprint are connected to required sources. Please note that LIS3DH and LIS3DE have the same pinout diagram, but they are many internal differences, including register and slave addresses. For instance, LIS3DH has 16-bit output reading for each axis, and LIS3DE has 8-bit outputs.

Other Footprints on the Expansion Board

There are 18 large square pads at the bottom layer of the PCB. All those pads are general purpose and are convenient for attaching large components or thick conductors.

Leftmost and rightmost columns "A" and "v" can be used for SIL connectors. Holes on these pads are with 1mm diameter, so they can accept normal male pins of SIL headers.

After you start Z80 emulator with CP/M, the machine boots up on A drive greeting you by prompt

A>

There is not much to do with this drive, as it is 22kB RAM disk. It is empty after boot, as you can try with command

dir

that prints what is in current directory. You can switch to disk B, where is more to be found

b:

and system will respond with

B>

meaning you are there. You can now list content of this directory again and discover a few executable (.COM) files, like XMDM, MBASIC or FORTH. You can play around with those; notice that some of them expect different line (CR) end than what badge uses (LF). You can do CR line end by hitting SHIFT+ENTER. Exit MBASIC by typing system<CR>.

On disk C you have some more goodies, namely famous ZORK game and SARGON chess game.

Disk D is empty, with 512kB of capacity. You can copy files to/from disks utilizing PIP program, with syntax of

pip d:=c:zork1.com

that will copy file zork1.com to drive d. Notice you should run this one from disk B, where pip resides, or explicitly set path to pip program.

If you want to erase the file, just type

era d:zork1.com

If you happen to need to list ASCII file, invoke command

type file.txt

or dump binary file in hexa form by running

dump file.bin

Stat command is used to display statistics of a file or drive; you can run

b:stat

to display info of drives or

b:stat *.*

to display information about all files on particular drive. Notice the wildcards - you can use it when copying or erasing the files too.

If you want to transfer files from computer (or perhaps another badge), you may use XMODEM program. Run

b:xmdm r d:filename

to start saving received file on D drive, and start XMODEM transfer on other side. The transfer speed is 19200 baud. You may try to archive files into ARC format and un-arc it on CP/M side with dedicated software, if you want to transfer more files. On linux, you may want to use sx to transfer files, or moserial or cutecom for GUI access, with windows, teraterm is good option.

You may want to try assembler toolchain consisting of ED editor, ASM assembler, LOAD program to convert hex to .COM file and DDT debugger. There is quite a lot of Z80 CP/M software on the interwebs, you may want to look for "walnut creek CP/M CD". Be prepared that a lot of CP/M software was designed for modified machines, sidetracking BIOS, so it may not run on this particular machine.

Notice badge has option to switch from local standard input/output (keyboard/display) to serial port (on pins C13 and C14 on expansion port, 3,3V levels, don't forget ground) by pressing LSHIFT+RSHIFT+BRK; with the same combination taking you back to local access. You may access the command line using terminal emulator on your PC, gaining somehow more comfortable access.

You can find more details about the CP/M commands and programs here and here.

Use your badge as a flashlight with 'lumos'

Find out how to do something on the badge, by looking at implementation details of a related existing BASIC command.

Look at three ways to trigger the new code:

Add it as a program to be launched at main menu command line.

Add it as a new BASIC command.

Add it to the default user program.

One of the first things we do with the badge is to light up its LED using BASIC commands. For this tutorial, we want to light up all three LEDs to use the badge as a flashlight. We can do this with the following simple BASIC program:

10 led 0,1
20 led 1,1
30 led 2,1

This works, but it's silly to take up a BASIC program slot just for this. So in order to add this feature to badge firmware, we start by looking at what happens under the hood when BASIC sees the "led" keyword.

Inside function statement() a TOKENIZER_LED triggers a call to led_statement()

led_statement() processes the tokens and calls into set_led()

hw.c:

set_led() sets the PIC32 pins corresponding to LEDs.

Copying from set_led(), we can write a short function to turn on all three at once:

void flashlight()
{
LED_R = 1;
LED_G = 1;
LED_B = 1;
}

Side note: this is equivalent to calling an existing function set_led_word(0x07), but for the sake of the tutorial we'll proceed with adding a new function.

Now we'll survey the options for putting our new function to work, you can use any combination of the below as you see fit for your code:

Option 1: add to main menu:

To light up LEDs when user enters a command in the main menu, we edit badge_menu() in badge.c. After the user presses enter (NEWLINE), there's an if/else tree to process commands. We can add a new menu command to this list. We'll make our new command "lumos".

(UPDATE: The Superconference badge firmware now has a much faster BASIC tokenizer, an upgrade over the Belgrade badge. The downside is that it's more difficult to modify. The instruction below applies to the slower but easier to modify BASIC tokenizer.)

This retraces our steps digging into BASIC commands, this time adding our own code.

basic/tokenizer.h:

Declare enum TOKENIZER_LUMOS.

basic/tokenizer.c:

Add to keywords[] array to associate string "lumos" with TOKENIZER_LUMOS.

basic/ubasic.c:

Add to the switch statement inside statement(), so a TOKENIZER_LUMOS will call lumos_statement()

Add new function lumos_statement() to process tokens and call flashlight().

Now "lumos" will work as a badge BASIC keyword

10 lumos

Option 3: add to user program:

The default user program waits for a user key press. Add a call to flashlight() just after a key is detected in user_program_loop() of user_program.c.

[...]
if (get_stat!=0)
{
flashlight(); /* Turn on all three LEDs */
/* Show which letter was pressed just as an example: */
[...]

With this change, the LEDs will light up on the first key press after the user program starts.

stdio_get() can get confused when multiple keys are pressed simultaneously so certain key combinations require direct reading. (Example: a game that needs to know a user pressed "Up" and "Right" simultaneously for a diagonal move.)

HOWTO: See under the hood of a BASIC command.

basic/ubasic.c: static void statement(void)

When the BASIC interpreter sees a recognized command (in the form of a token) statement() will call a corresponding C function to do the actual work.

HOWTO: Add a new BASIC command.

tokenizer_generate/ubasic.re

This is the input file for re2c to generate a new high speed BASIC tokenizer.

HOWTO: I2C

(Added in version 1.21)

hw.c: iic_init(), iic_start(), etc

user_program_temp.c is not part of the badge firmware build, but serves as sample program demonstrating interaction with Si7020 temperature sensor over I2C.

HOWTO: PWM

Easy way: Take over one of the three audio voice timers (Timer2/3/4) and, instead of always inverting one of the audio generator pins, count duty cycle and output to one of the expansion port pins accordingly.

Sadly, the screen of e71 and e63 is 3.36". I found some on aliexpress but when i asked them for datasheet they said they dont have the product and datasheet anymore. So i stuck a bit about that project. But Nokia Asha 210 and nokia C3 have 3.4" display so i can look forward to that design. Also reverse engineering the keyboard and writing a driver is the hardest part after the LCD

I've seen them and it still doesn't explain how the numbering in front of the instruction work. According to the NOTE "It is recommend that you number every 10 lines or more so that you can add commands in between them as you develop your code."

I don't see any discussion of the types of variables supported by the BASIC interpreter. Does it support arrays?

Also I don't see any mention of facilities for reading or writing data to/from a text file. I could do my project by poking data into memory but normally there is a facility for protecting areas of memory from BASIC overwrite.

Does the CP/M environment support/include a more full featured version of BASIC?

If I understand correctly, PICKIT3 is the only way to re-flash the badge? Do you guys know easy way to use PICKIT3 from Linux? Last time when I checked (couple years ago?) it was NOT possible. Something changed recently?...

I can explain - I will bring my Linux laptop to superconference with IDE as 2 years ago, but in that time (2016) it was much easier because you simply connected badge to the computer through USB and it was opened in Linux as USB storage where you can put HEX-file as a file.

I know it can do much more but for me it looks like an awesome as a little VT100 terminal for my (mobile) Arduino projects. I'm currently working on a LoRa based BBS/chatroom, this could make my perfect vt100 terminal. Shouldn't be too hard to implement basic VT100 in basic.

It's a good question. The hardware schematics is the same, but there will be many firmware updates and modifications. So yes, you can reflash the whole program memory and use the Belgrade badge with a new firmware (but I am not sure about the new BASIC programs on the old firmware). The only different component is the external FLASH memory, but it should be compatible with the old one.

Unfortunately the FLASH memories aren't the same and there are tiny details between them that make it incompatible.

As worst case solution I'm planning to backport the changes from SuperCon badge to Belgrade firmware, or better adding some conditional compilation (so that codebase for SuperCon will work for Belgrade badge) or even better making the FLASH detection automatic.

Ah yes - thank you for pointing this out. We might want to have a usb battery with a voltage regulator then! Hmm. In lieu of Eagle, would you be able to make a quick sketch by hand that shows the dimension and angle of the header connector? That's the tricky part :)

Files are in Circuit Studio, which has very poor export possibilities. I usually build the Gerber file, and then export it to some other format. Unfortunately, my Gerber Viewer has no vectored export, but only several bitmap formats. I am just searching for some Gerber viewer which can export standard vectors (DWG, DXF or so).

I looked up the Belgrade Superconference badge gerbers (is it the same?) and managed to import those into KiCAD through it's GerbView utility, although it seems to have vastly enlarged pads on all of the vias for some reason.

I can export that as a STEP file that Autodesk Fusion 360 can work with, but that doesn't give me the heights of any of the components used on the board.

This leaves me with either a lot of guesswork, or else I have to repopulate the board in KiCAD to get accurate outlines. I don't know if I really have time for either of those, but I'd like to try to get something done.

If I can get an accurate picture of the front (maybe scan it in a flatbed scanner?) and maybe a few caliper heights for the components, I can give it a shot. The most important thing is to get the buttons right, because otherwise the keyboard will be unusable.

Of course, I could do much better if I could get my hands on a badge in advance of the event. This kinda stuff needs to be done before the event and not at it because the 3d printer job will take at least 24 hours to run. I could do acrylic more quickly, but I don't know if they will let me in the laser cutter room during the event... it's kinda noisy and smelly, which isn't good when they are having sessions right next to it...

I found the Gerbers for the previous Hackaday Belgrade badge, and after a lot of work I made a 3d model from them. I put it in the public chat for this project. I'll see if I can come up with an enclosure on Friday.