A real-time Rock-Paper-Scissors game running on the Arduino UNO Q using an Edge Impulse object detection model.
The camera detects your hand gesture (rock, paper, or scissors) via machine learning inference, while the Arduino picks a random move. Are you going to win the Arduino UNO Q?
- Arduino UNO Q with Arduino App Lab
- USB camera connected to the board
- Edge Impulse machine learning model trained to detect
rock,paper, andscissorsas you can find in this public project here. Clone it and re-train it to improve the accuracy with your light and background.
Clone this repository to your local machine.
Copy the entire Rock Paper Scissors folder to the Arduino UNO Q board:
scp -r Rock-Paper-Scissors-Arduino-UNO-Q/ arduino@<device-ip>:/home/arduino/ArduinoApps/RPS-gameor use the Arduino App Lab Create new App button in the My Apps section and import the application.
Get into the Rock Paper Scissor app into the Arduino App Lab.
Click in the Brick Video Object Detection and then click Train new AI model in the bottom.
Log In into your Arduino account and the Edge Impulse account and then train your own Rock Paper Scissors model or clone this public project and re-train it.
Go to deploy the model as Arduino UNO Q or as Linux aarch64.
Then the deployed models will appear in the brick of the Arduino App Lab when you will go to the AI models tab. Select the Rock paper scissors model.
And check that it's being added in the app.yaml file of the app.
Launch the Arduino App Lab in your local machine and get into your Arduino UNO Q.
Go to My Apps and you may see the Rock Paper Scissors application there. Click on it and then click Run.
Alternatively, via SSH you can start the application using the Arduino App Lab CLI.
arduino-app-cli app start user:rock-paper-scissors-gameOnce successfully started, navigate to http://<device-ip>:5001 in your browser and start playing!
Good luck!
- Show your hand gesture (rock, paper, or scissors) to the camera.
- The detection panel on the left shows what the model sees in real-time after running inference on a local object detection Edge Impulse model.
- Click Play Round — your gesture is locked in at that moment.
- The Arduino reveals its random move and the winner is shown
All settings are in python/main.py at the top:
| Setting | Default | Description |
|---|---|---|
CONFIDENCE_THRESHOLD |
0.6 |
Minimum confidence to accept a detection |
PORT |
5001 |
Flask web server port (also set FLASK_PORT env var) |
COUNTDOWN_SECS |
3 |
Countdown duration before evaluating |
RESULT_HOLD_SECS |
3 |
How long the result stays on screen |
In case that you want to create your own object detection model using Edge Impulse.
Collect data, label it and train the neural network. Test it in Edge Impulse and when you will feel confident, deploy it as an Arduino UNO Q model or Linux aarch64.
Then follow the same instructions that you performed to add it to the app's brick.
Want to learn more about how Edge Impulse ork? Try one of the Edge Impulse courses.
"No gesture detected" every round:
- Check that the brick is initialized: look for
[BRICK] VideoObjectDetection initializedin logs - Check that
App.run()is active: look for[MODE] App runner: yesin logs - Look for
[BRICK-RAW]lines — if absent, the brick callback isn't firing - Ensure your model labels match
rock,paper,scissors(lowercase)
"App runner: no" in logs:
- The
Appclass couldn't be imported. Make sure you're running viaarduino-app-cli app start, notpython3 main.pydirectly
Model not found:
- Verify the
.eimfile exists at the path inapp.yaml - Ensure the file is executable:
chmod +x /home/arduino/.arduino-bricks/ei-models/rcp-model.eim
Feel free to reach out to us on the Edge Impulse forum or the Edge Impulse Discord server if you need help.
This project is intended for educational and experimental purposes only. It is not hardened for production use. Do not deploy in any safety-critical environments without proper security, testing, and validation.







