It was good fun to make and people seemed to enjoy it but it wasn't in a state for someone else to make easily and wasn't robust so running repairs were needed.
But I really liked it and wanted to do a version that others could make easily.
At the same time EasyEDA was starting to be advertised as a simple web based PCB design tool with integration to a PCB fabrication facility so getting the boards manufactured would be super easy. So, I took the plunge and designed a PCB and had 10 of them manufactured.
Soldered up
I soldered a pair and started running code to test them and it kept failing. I tried different libraries and different setups and every time I couldn't get it to work reliably. This is part of the pleasure of using code and electronic components created by others.
Today I figured out one of the NRF24l01 that I used can transmit but not receive. Maybe I damaged it as had power caps in the wrong way around when testing early on.
I soldered up a 3rd but without the switch and LED and ignoring the bad one the pair I used were reliable today.
Now as I tried lots of sample code and had different results with them I have prepared my own tester code.
This code uses the Arduino, NRF24l01, LED attached to Pin2 (through current limiting resistor) and switch on Pin3 using internal pull up.
When uploaded the Arduinos start in transmit mode.
Press the switch on one and it transmits and switches to receive mode.
Now you have one in transmit and one in receive mode.
Pressing the switch on the transmit one and it's LED will flash 5 times and change to receive mode and the receive one will turn it's LED on full and change to transmit mode.
It's amazing how much fun it is to press the switch. See the change. Then press the switch on the other one and see them swap roles.
So, if you are messing with Arduino and NRF24l01 then maybe this code will be useful to help you.
IMPORTANT: The code in this blog post is the original code which does work but may not have all the enhancements. If you're building your own I recommend grabbing the code from GitHub.
GitHub link: https://github.com/winkleink/buttonFlash
Update: 19th September: Took buttonFlash to the Cambridge Raspberry Jam on the 17th of September and it got a proper outing.
UPDATE: 25th August:
Made Raspberry Pi program look prettier
Added sound effects
A few years ago I thought it would be fun to come up with an outdoor game that would get people running around. The Whack-a-Mole/reflexes button game came to mind and this is the result. A game where you have to press buttons as quickly as possible.
Whack-a-Pi was in constant play at the Raspberry Pi 4th Party.
The concept for buttonFlash is similar to Whack-a-Pi but with the ability for the buttons to be much further apart. Goal is to get people running around. With the buttons further apart there was no way I was going to be managing physical wires as it would be a trip hazard and I didn't want to have to manage that many wires. So, wireless communication between the base and the buttons seemed the obvious choice.
Most fields don't have wifi. I could bring along my trusty Vocore and create a local WiFi hot spot but again I want this to be simple to set up and use.
VoCore. Basically guts of a Wifi router
So, I thought the NRF24L01 would do the trick. They're a really cheap transceiver. They can transmit and receive signals making them ideal for short range two way communication.
On the Arduino I used the RF24 library. If you've the latest version of the Arduino IDE you can install this through the library manager or if you prefer you can go old school and download it from the GitHub repository at the link above. More details on using the NRF24 with Arduino
The Arduino side was relatively straightforward to get working while the Raspberry Pi side had me stumped for a while. Then earlier this year I had a breakthrough when I met +Elliot Pittam. He had seen the first Wimbledon Raspberry Jam and was interested in coming along. On email we discussed what we were working on and Elliot said he was using the NRF24L01 with the Pi and Arduino. We then met at a HackWimbledon event where he showed me his set up and shared his working code. Elliot helped me sort my circuit and pointed me to 2 great videos on using the NRF24L01 with both Arduino and Raspberry Pi.
Tutorial 34 - Part 1
Tutorial 35 - Part 2
With Elliot's assistance I successfully had the Raspberry Pi communicating with the Arduino.
Many of the example I found did not clearly identify which pins on the Arduino or Raspberry Pi were connected to which pins on the NRF24L01. Therefore, below is the wiring I used for the Raspberry Pi and the Arduino with the code provided. So, it all matches up nicely.
NRF Pi GPIO Pin
VCC 3.3V 1
GND GND 6
CSN GPIO8 24
CE CPIO17 11
MOSI GPIO10 19
MISO GPIO9 21
SCK GPIO11 23
NRF Arduino VCC 3.3V GND GND CSN Digital 10 CE Digital 9 MOSI Digital 11 MISO Digital 12 SCK Digital 13
For the Arduino to keep it compact I went with Arduino Nano compatible board on a small 170 pin breadboard. Easy build and easy maintenance.
It's important to know these compatibles use the CH340G serial chip which is different to the Arduino branded. You will need additional driversto get these working with some computers.
To make each of the buttons base I needed a suitable container to hold the button and the rest of the electronics and of course the button. I'd seen these great 60mm buttons with LEDs built in so I order some. Again from eBay UK these are about ~£7.00 for five.
RED 60mm LED button
The ones I ordered are 12V rated which is the power for the LED. Opening it up these things just have a standard LED and a current limited resistors. The resistor was a 460 Ohm for the 12 volts. Without knowing the specific LEDs and their voltage drop and maximum current I played it safe and replaced the 460 Ohm with 150 Ohm resistors. The buttons did light very dimly with the 460s but were far brighter with the 150 Ohm. Below is the button being taken apart.
button in place
unscrew the button/LED assembly
pull out the LED (like Christmas lights)
remove LED with resistor on Anode (+ side, other goes to GND)
solder on replacement resistor and put it all back together
To test the LED at each stage I ran an Arduino with the blink sketched and wired the LED across pins GND and 13. Once all reassemble with the wires attached again I tested to make sure I didn't mess things up in putting it back together.
Next, for each Arduino I wired the NRF24L01 as per above. The LED was wired to Pin 2 and Button was wired to Pin 3. In code I activated the internal pull up resistor so the button is held high until you press it and then it goes low.
it all wired up.
As the Raspberry Pi needed to send a message to the Arduinos to let them know which one is to activate their button and wait for it to be pressed before replying I came up with a simple message that is extendable. Basically, the number of the Arduino followed by 'P' Examples: 1P, 2P, 3P, 4P, 5P
This would be the message sent out.
All Arduino would receive it and then using a simple IF statement would decide if it means they are to be activated. If not go back to listening. If yes light the button and wait for it to be pressed. Once pressed reply to the Raspberry Pi that the button has been pressed.
In this way the Arduino are dumb. They only respond to a request for the button and reply it's been pressed. They don't care if they are the first, second, third,... button to be pressed in the game. All that is managed at the Raspberry Pi.
To make it easier to setup and to test I included a test mode.
When you press 't' it sends the test message and all the Arduino flash their LEDs 5 time. Then Arduino 1 (as there will always be at least 2 Arduino) replies that it is completed.
The Raspberry Pi doesn't do anything with this message as the test is to see if it is sent and replied to which the users sees in the console.
This means Button/Arduino 1 has slightly different code to all the rest of the buttons.
Button/Arduino 1 code with the extra bit for Arduino 1 only highlighted in RED
For each Button/Arduino the text highlighted in BLUEneeds to be changed to matched the relevant reference in the Raspberry Pi list. This text is the same in all 3 locations so you can do a Find/Replace to do it in one go.
Serial.println("We sent our message: " + String(text));
}
// Test scenario
if (stringMessage == "TEST") {
for(x=0; x < 5; x++){
digitalWrite(ledPin,HIGH);
delay(500);
digitalWrite(ledPin, LOW);
delay(500);
}
Serial.println("Test completed");
const char text[] = "Test done";
radio.write(text, sizeof(text));
Serial.println("We sent our message: " + String(text));
}
}
delay(100);
}
On the Raspberry Pi side the code is a little more interesting as it sets up the NRF24L01 and then creates a graphical window using pygame and finally runs the game. At this stage it displays Score and High Score.
The steps to get the Raspberry Pi ready are:
Wire up the NRF24L01 as per above
Use the Raspberry Po configuration program to enable SPI (you have to reboot after this)
Then run the following commands.
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install python-dev python3.dev -y
I'm assuming you're in hour home directory for the rest of this.
mkdir buttonFlash
git clone https://github.com/Gadgetoid/py-spidev
cd py-spidev
sudo python setup.py install
sudo python3 setup.py install
cd ..
git clone https://github.com/BLavery/lib_nrf24
cd lib_nrf24/
cp lib_nrf24.py ~/buttonFlash
cd ..
You should now have SPI working with the python SPI libraries installed for Python 2 and 3 as well as the required lib_nrf24 for working with the NRF24L01 from python.
Finally the library file is copied to the buttonFlash directory.
Copy the Raspberry Pi code into the buttonFlash directory and run it.
Here is a short example of it running after the initial build.
With the electronics sorted and the programs functioning the next requirement was a housing for the buttons. I thought I found the perfect one when I got this spaghetti container from Home Bargains. It all fit comfortable and the button was really secure.
Only problem was when I went back to get more they were out of stock with no idea when/if more would be coming in. Then I saw the Pringles can and tried it out and it worked. Pringles cans for the win.
Oh, and I had to eat another 4 cans of Pringles to get the 5 required.
As this is designed to be played indoors or outdoors I needed to fina a way to make them stable when placed in a field. I went super simple and bought 150mm bolts with nuts and passed them through the bottom of the Pringles cans. You'll notice I numbered each can and there is also a colour listed. I bought 5 different coloured breadboards so I could tell which Button/Arduino was in each can.
You can see the bottoms of the tubes are deformed a bit. Ends up Pringles cans aren't super strong. Means I have to re-tighten the nuts as they work lose. Wonder if an application from a glue gun will sort this out.
bottom of each Tube with bolt, number and colour
all the bits outside the can.
If you watched the video at the top or the video at the bottom you might have noticed the Pringles cans have a bit of a base to keep them stable for indoor use. In the rush to push the buttons the Pringles cans were falling over. The solution was some microwave pots that tapered from the bottom to the top turned upside down and with a hole cut int he bottom. This gives a nice wide base. If further stability is needed these pots could be filled with sand or stones to weigh down the bottom even more.
microwave pot used as base
This was an interesting build as I never used NRF24L01s before. Finding the information on how to get them to work and wire them up was interesting as most of the guides nearly provided the full details and they all seemed to provide slightly different information. So, I enjoyed solving that riddle and end up with a playable game that scales in the number of buttons and also the space.
This could be set up as 10 buttons on a table with all the cans tied to each other or as 20 buttons around the outside of a field. You'll hear in the video below that the Raspberry Pi can call out the button numbers. This definitely made it a bit easier as you quickly learn which button is which position. For outdoor use if it is very sunny I have a feeling the LEDs in the buttons will not be bright enough. So, next I will be adding more lights and indicators to the buttons so they can be identified outdoors.
Here's another video of the game being played at the Cambridge Raspberry Jam.
If you have any questions or comments let me know.