Hey guys! Finally I got time to blog about the technical details behind the whack-a-mole game.
Click here to view the previous part of this blog post, which is a release announcement of this game.
The game is powered by Dinbo Prototype A, which is a telephone system that I developed using SIM900A module with Raspberry Pi 3.
The schematics diagram of the system is shown below:
I knew. This system is stupid. Instead of connecting the mic and speaker of SIM900A with Raspberry Pi, GPIO is used for voice communication between them. To make the thing even funnier, an ATtiny13 is used as an ADC.
Anyway, this is just an early prototype. I just wanted to tinker around with the electronic parts that I have. And this design suits the purpose very well. More importantly, this system works. :P
Here is how does the SIM900A and ATtiny13 look like after everything is connected:
As shown above, the entire system is deployed on a breadboard.
Due to the high current requirement, multiple breadboard wires is required for the power supply of SIM900A. A capacitor is also connected between VCC and GND to smooth the voltage level over time(not shown on the outdated photo above).
Many programs were written for this system. They are ATtiny13 ADC program, serial multiplexer program, voice to socket program, and the whack-a-mole program. All of these programs are written in C.
The ATtiny13 ADC program, as its name suggests, is a program installed on the microcontoller for the purpose of converting the analog voice signal from SIM900A to time-based digital signal. When a "get sample" signal is received by PB1, it will read the analog input of PB3 send a digitized signal via PB4 to Raspberry Pi. This is the first non-Arduino embedded program I have ever developed. I had some fun on reading the specification of ATtiny13. The library avr-libc was used.
The voice to socket program is a program that converts the digitized audio signal received from the ATtiny, then send it to the whack-a-mole program using unix socket file. This is the first real time program I have developed in my life. To achieve real time execution of code, a CPU core is reserved solely for the linux process of this program.
The serial multiplexer allows multiple programs write to the serial interface of SIM900A. It redirects all of the data received from socket to the serial interface. It is adapted from this program found on Stack Overflow.
The Whack-a-mole program works by communicating with the serial multiplexer as well as the voice to socket program. It also detects DTMF tones by processing the audio signal received. Other than that, it is just like other C programs.
The source code of these programs are poorly organized. I still don't have time to package them. There are also some copyright issue on the serial multiplexer because majority of code is taken from the Stack Overflow answer with unspecified license. Therefore, I cannot release these programs too publicly. However, a copy of source code can be requested by email and they are considered on case-by-case basis.
For the final year project of my college, the development of Dinbo Prototype B is started, which will be a successor of the current system. Standard analog audio interface will be used(instead of doing the analog<->digital conversion hack using GPIOs). I also plan to solder it on a perfboard.
The library will be written in Python, which is much more flexible than C. It will be mainly designed for non-game telephone systems. However, it should be possible to make a game with it. After the completion of the library, I'll port this game to Dinbo Prototype B. I will update you guys about any news on it.
Sorry for not updating for a while guys.
Spent almost $100 on hardware and stuffs, worked for more than a month, Whack-a-mole over telephone is finally completed!
各位! 好耐無打廣東話嘅blostpost. 耗資陸佰港元. 動工參拾陸夜. 小弟嘅電話扑傻瓜終於搞掂喇!
Behold the gameplay(Cantonese with English subtitle)!
The gameplay is simple. First, dial the number 5517 6408 in Hong Kong(does not accept international call, Cantonese only). Then, when you hear certain sound, you'll have to press certain key. The sounds and the keys are randomly generated. If you press the correct one, you get a score. When it reaches the threshold, the difficulty will be increased as shown below:
Level 1: Score requirement: 0; Three random animal sounds. Each requires the player to press a key.
Level 2: Score requirement: 10; Three additional random synth'd wave sounds. Each requires the player to press a key.
Level 3: Score requirement: 30; Three additional random voice of numbers. Each requires the player to press another key that is usually inconsistent with the number that the player have heard.
Level 4: Score requirement: 60; After this level, the player has to press certain key for every 5 sounds, regardless what is the sound that the player has heard.
Level 5: Score requirement: 100; Upon hearing any of 5 random sounds, the players has to press a key. Upon hearing another 5 random sounds, the players has to press another key. Upon hearing yet another 3 random sounds, the player has to press yet another key.
遊戲玩法好簡單. 首先打5517 6408(唔收國際電話, 唔收133電話), 跟住佢就會叫你聽到某D聲就要撳某D制. D聲同D制係隨機嘅. 撳啱加分. 夠分就LEVEL UP:
LEVEL 1: 所需分數: 0; 三個隨機動物聲. 每個聲要撳一粒制.
LEVEL 2: 所需分數: 10; 三個隨機電腦合成聲. 每個聲要撳一粒制.
LEVEL 3: 所需分數: 30; 三個隨機數字聲. 每個聲要撳一粒制, 而嗰粒制通常唔係你聽到嗰個數字嘅聲.
LEVEL 4: 所需分數: 60; 每聽到五個聲就要撳某一粒制.
LEVEL 5: 所需分數: 100; 聽到某五種聲要撳一粒制. 聽到另外某五種聲要撳另一粒制. 聽到另外某三種聲又要撳另一粒制.
If you press the wrong key, or if you're too slow, then you lose. If your score is the highest among everyone else, the score will be recorded.
如果你撳錯制或者撳得太慢就會輸. 如果你嘅分數係最高嘅話, 個分將會被記錄.
Alright! That's it for the first part of the blogpost. The second part will be about the technical details of this project. See you! :)
Better to be late than never announcing it. The Poland Event website is closed.
The hoster could not pay for the hosting fee. Therefore, the site is closed about a month after the begin of the event.
Considering that the hoster is relatively young, he is a genius of being capable for setting up a website for the event.
Give a big hand to Eruverio! Our hoster/organizer of the RPS tournament 2016!
We will definitely host another event next year! I'll probably find someone who is capable for keeping the site alive for at least a few years.
The system runs out of RAM
Kill RAM intensive processes, or use swap.
I have installed CUPS on my Raspberry Pi. It was connected to a USB printer and made it accessible via my LAN. It had been working very well until the recent. In these few weeks, somehow the printer does not print.
I entered the CUPS web interface of my Raspberry Pi and tried printing a test page. Funny enough. It claimed that the print job was completed, despite that the printer did nothing.
Then I dig up /var/log/cups/access_log. Here is what's inside.
localhost - - [10/May/2016:14:37:12 +0800] "POST /printers/Canon_MG2400_series HTTP/1.1" 200 422 Print-Job successful-ok
It claimed that the print is a success. Obviously that's not true!
Then I dig up /var/log/cups/error_log. Unfortunately, there was nothing inside.
Then I started trying stuffs like:
None worked! :(
Then I figured out that there is something called LogLevel in CUPS config. I modified it as follows:
And I restarted CUPS. Then I noticed the following messages appeared in /var/log/cups/error_log:
D [10/May/2016:14:37:20 +0800] [Job 136] Error: /undefined in --setpagedevice-- ... D [10/May/2016:14:37:20 +0800] [Job 136] Last OS error: Cannot allocate memory D [10/May/2016:14:37:20 +0800] [Job 136] GPL Ghostscript 9.05: Unrecoverable error, exit code 1 ... I [10/May/2016:14:37:22 +0800] [Job 136] Job completed.
What? Obviously something went wrong! How on the earth could the level of that message merely be a debug? I think that should be at least a warn! More importantly, how come it is called "Job completed"? I think that should be "Job Failed" instead! :<
After that, I increased the swap space. And remote printing starts working again. :D
Took me a few hours to figure that out. I couldn't find this solution in Google. That's why I blog about this. Hopefully someone somewhere would somehow find this blogpost helpful.
UPDATE: I've filed a bug report to the CUPS developers. Hopefully it will be fixed soon.
Thanks to Let's Encrypt. We can now get SSL certificates for free!
I was slacking off while doing homework. That's why I did the HTTPS setup yesterday. :P
Currently, only some of the subdomains of sadale.net supports HTTPS. I'd like to test it for a while before enabling it for all of the domains.
Many image links in blogposts are still having http:// prefix . I'll convert them to https:// when I got time.