r/arduino 1d ago

Header-only C++17 protocol decoders for logic analyser captures — I2C, SPI, UART — with waveform synthesis so they're testable round-trip

5 Upvotes

I wrote logicdec, a tiny header-only C++17 library for parsing logic analyzer captures:

  • decoders for I2C, SPI, UART (more buses planned)
  • takes raw capture samples, emits decoded frames/transactions
  • includes waveform synthesis so the decoders can be tested round-trip without a real capture file

Single-header, no deps: https://github.com/meister5/logicdec

If you've ever parsed a Saleae-style export by hand, this is that, but as a reusable library instead of a one-off script.


r/arduino 1d ago

Hardware Help Driving SAB8275 from arduino?

Post image
13 Upvotes

I have a small monochrome ttl mda crt i’d like to repurpose. the crt came from an old intel based rack mount computer and drove the display using an 8275 crt controller. since arduinos aren’t great at raster graphics i’m curious if it’s possible to use the 8275 paired with a rom to hold graphics and font driven by an arduino to use the crt.


r/arduino 1d ago

Hardware Help I2C pull-ups to 3.3V and 5V

6 Upvotes

I though pull-up resistors on I2C bus is a relatively simple concept for understanding. But 3.3-5V modules are confusing and hard to understand (at least for a beginner like me). They have 5V input, but a chip is on 3.3V behind a voltage regulator. How should I deal with the pull-ups when I'm connecting multiple 3.3-5V modules?

For example, TCS34725 RGB Color Sensor has 10k pull-up to both 5V and 3.3V

while GY521 MPU6050 accelerometer has 2.2k pull-ups to 3.3V

I want to understand how should I deal with modules like these. There will be 4 different I2C modules in my project. How to understand when I need to remove some internal pull-ups or add external pull-ups (taking into account two different voltages). I understand how to calculate total resistance of I2C pull-ups when it's juts 5V, but I don't understand what's happening with I2C bus when some of resistors are on 5V and some are on internal (for a module) 3.3V. And is it better to connect modules that support both 3.3V and 5V to Arduino Nano 5V or 3.3V?

A 3rd module has no pull-ups. A 4th one - I'm not yet sure, need to find a datasheet. I see 10k resistors on a module, so it probably has 10k pull-ups to 2.8V. One more voltage to make things even more confusing.


r/arduino 2d ago

Look what I made! Ultra-real simulation of an ultra-rough robot I built

Enable HLS to view with audio, or disable this notification

126 Upvotes

(simulation starts at 18 seconds)

This (potentially embarrassingly simple) robot is actually representative of my current ability to build a real robot.

I designed the robot's mechanical structure in CAD, planned its electronics and wired them (again in CAD), and then exported its URDF and dropped it into the simulator that I built.

The Arduino code is pretty much written by AI after I showed it my wiring, a screenshot of the robot structure, and told it what I want it to do. I confirmed that the code runs correct in sim.

Then I assembled the robot and flashed the firmware. Lo and behold, it works! :)

I always wanted to be able to design the whole robot in software and now it seems to work (at least for this simple case)

CAD, wiring and BOM are all here: https://github.com/one-for-all/four-legged

Simulation platform: https://sim.aperobotics.io It is quite limited in functionality at the moment.

I would be eager for any feedback


r/arduino 1d ago

A 21-tool GPIO workbench I wrote for the ESP32-S3 Cardputer — drive pins, probe I2C/SPI/UART/1-Wire, log to CSV, optional web UI

3 Upvotes

Here's CardputerGPIO, an Arduino project I've been building: a GPIO workbench for the M5Stack Cardputer ADV (ESP32-S3) so you can test hardware without writing a throwaway sketch for each thing.

  • 21 tools: drive pins, read them, generate signals, and scan/probe I2C, SPI, UART and 1-Wire
  • Log everything to CSV on the SD card
  • Optional WiFi web UI — same tools from a browser with a real keyboard
  • Board-agnostic guards: it refuses to boot on the wrong board (the ADV's pin map and keys differ from the v1.1) rather than silently misbehave
  • Only needs the three official M5Stack libraries

Repo (MIT): https://github.com/meister5/CardputerGPIO

Built the tool architecture specifically so adding a new 'tool' is just a small class — design feedback welcome.


r/arduino 1d ago

Hardware Help Interfacing Arduino with E22-900T22S LoRa module from Ebyte

0 Upvotes

I am currently trying to connect the said LoRa module for data transmission and receiving. But almost all the websites I have scoured trhough use either a Raspberry Pi or STM32. Is it actually possible to do the connection with an arduino? I am currently using two of the said LoRa module one as transmitter and other as receiver. Each connected to their respective arduino. It would be very helpful if I could get the answer as soon as possible. Thank you


r/arduino 1d ago

Need advice for a 6-DOF robotic arm with AS5600 encoders

3 Upvotes

I'm building a 6-DOF robotic arm with FT5330M servos (35.5 kgcm @ 7.4V, 180° travel), driving them directly from an ESP32 with hardware PWM. I want to add an AS5600 per joint for more precise positioning. The goal is to use the arm for imitation learning, so I need to read the true joint angle at every timestep — both to record demos and to feed the policy.

My plan is to power the servos from a 2S LiPo (7.4V) through a separate distribution bus. The ESP32 shares ground with that bus but only sends signal. On top of that, an AS5600 per joint through a TCA9548A mux, with the magnet on the moving link rather than the servo horn. Plus an INA226 per joint for current the datasheet gives Kt as 10 kgcm/A, so current reads directly as joint torque, and it doubles as stall detection.

A couple of questions:

Will this plan work well or do I miss something?

Should I gut the internal driver? Building my own H-bridge and PID would give me full control and clean feedback through the AS5600, but that costs time and money. Is it worth it, or does my plan work fine as is?

If I don't gut it, is there any way to get past the 180° limit externally? And do I actually need 360°? The STS3215 in SO-101 has it, but I'm not sure whether that's a requirement or just a nice-to-have.

Note: I don't have access to the STS3215 used in the LeRobot SO-101 arm, so I'm trying to build something capable of the same tasks with the servos I can access.


r/arduino 1d ago

Hardware Help Bluetooth module flashes once and then turns off — is the module faulty?

0 Upvotes

Hi everyone,

I have a Bluetooth module (the module shown in the picture).

When I power (5V) the module, the LED flashes only once and then turns off completely. It does not continue blinking as I expected.

I would like to ask:

- Is this normal behavior for this module, or does it indicate a problem?

- What could cause the LED to flash once and then turn off?

- Is there any way to troubleshoot or repair the module?

I would really appreciate any advice from someone who has experience with this module.

Thank you very much!


r/arduino 1d ago

WORKING ARDUNO PONG!!!!!!!!!!!

0 Upvotes

This program is compatible with the Arduino Uno R3, a 4×4 matrix keypad, and a 16-pin 16×2 character LCD operating in 4-bit parallel mode.

WIRING For lcd screen:

LCD 1 VSS/GND → Arduino GND

LCD 2 VDD/VCC → Arduino 5V

LCD 3 VO → Arduino GND

LCD 4 RS → Arduino D6

LCD 5 RW → Arduino GND

LCD 6 E → Arduino D7

LCD 7 D0 → NOT CONNECTED

LCD 8 D1 → NOT CONNECTED

LCD 9 D2 → NOT CONNECTED

LCD 10 D3 → NOT CONNECTED

LCD 11 D4 → Arduino D10

LCD 12 D5 → Arduino D11

LCD 13 D6 → Arduino D12

LCD 14 D7 → Arduino D8

LCD 15 LED+ → Arduino 5V

LCD 16 LED− → Arduino GND

WIRING for keypad:

Keypad R1 → D2

Keypad R2 → D3

Keypad R3 → D4

Keypad R4 → D5

Keypad C1 → D13

Keypad C2 → A0

Keypad C3 → A1

Keypad C4 → A2

PROGRAM:

#include <LiquidCrystal.h>

#include <Keypad.h>

#include <EEPROM.h>

// =====================================================

// LCD

// =====================================================

LiquidCrystal lcd(6, 7, 8, 10, 11, 12);

// =====================================================

// KEYPAD

//

// 1 2 3 A

// 4 5 6 B

// 7 8 9 C

// * 0 # D

// =====================================================

const byte ROWS = 4;

const byte COLS = 4;

char keys[ROWS][COLS] = {

{'1', '2', '3', 'A'},

{'4', '5', '6', 'B'},

{'7', '8', '9', 'C'},

{'*', '0', '#', 'D'}

};

byte rowPins[ROWS] = {

2, 3, 4, 5

};

byte colPins[COLS] = {

13, A0, A1, A2

};

Keypad keypad = Keypad(

makeKeymap(keys),

rowPins,

colPins,

ROWS,

COLS

);

// =====================================================

// LIFETIME SCORE

// =====================================================

unsigned long lifetimeScore = 0;

const int EEPROM_SCORE_ADDRESS = 0;

// =====================================================

// SCREEN

// =====================================================

const int SCREEN_WIDTH = 80;

const int SCREEN_HEIGHT = 8;

// =====================================================

// PADDLES

// =====================================================

const int PADDLE_HEIGHT = 4;

const int PLAYER_X = 1;

const int CPU_X = 78;

float playerY = 2;

float cpuY = 2;

// =====================================================

// BALL

// =====================================================

float ballX = 40;

float ballY = 4;

float ballDX = 0;

float ballDY = 0;

// =====================================================

// SCORE

// =====================================================

byte playerScore = 0;

byte cpuScore = 0;

const byte WIN_SCORE = 5;

// =====================================================

// AI DIFFICULTY

// =====================================================

byte aiDifficulty = 1;

// =====================================================

// GAME STATE

// =====================================================

bool gameRunning = false;

// =====================================================

// TIMERS

// =====================================================

unsigned long lastFrame = 0;

unsigned long lastAIUpdate = 0;

// =====================================================

// AI SETTINGS

// =====================================================

unsigned long aiReactionDelay;

float aiMoveAmount;

byte aiAccuracy;

// =====================================================

// BALL SPEED

// =====================================================

float ballSpeed;

// =====================================================

// GRAPHICS BUFFER

// =====================================================

byte screenBuffer[16][8];

// =====================================================

// LOAD LIFETIME SCORE

// =====================================================

void loadLifetimeScore() {

EEPROM.get(

EEPROM_SCORE_ADDRESS,

lifetimeScore

);

if (

lifetimeScore > 1000000UL

) {

lifetimeScore = 0;

EEPROM.put(

EEPROM_SCORE_ADDRESS,

lifetimeScore

);

}

}

// =====================================================

// SAVE LIFETIME SCORE

// =====================================================

void saveLifetimeScore() {

EEPROM.put(

EEPROM_SCORE_ADDRESS,

lifetimeScore

);

}

// =====================================================

// ADD LIFETIME POINT

// =====================================================

void addLifetimePoint() {

lifetimeScore++;

saveLifetimeScore();

}

// =====================================================

// CLEAR GRAPHICS BUFFER

// =====================================================

void clearBuffer() {

for (

byte x = 0;

x < 16;

x++

) {

for (

byte y = 0;

y < 8;

y++

) {

screenBuffer[x][y] = 0;

}

}

}

// =====================================================

// SET PIXEL

// =====================================================

void setPixel(

int x,

int y

) {

if (

x < 0 ||

x >= SCREEN_WIDTH ||

y < 0 ||

y >= SCREEN_HEIGHT

) {

return;

}

int characterX =

x / 5;

int pixelX =

x % 5;

screenBuffer[characterX][y] |=

(1 << (4 - pixelX));

}

// =====================================================

// DRAW PADDLE

// =====================================================

void drawPaddle(

int x,

int y

) {

for (

int i = 0;

i < PADDLE_HEIGHT;

i++

) {

setPixel(

x,

y + i

);

}

}

// =====================================================

// DRAW BALL

// =====================================================

void drawBall() {

setPixel(

round(ballX),

round(ballY)

);

}

// =====================================================

// RENDER GAME

// =====================================================

void renderGame() {

clearBuffer();

drawPaddle(

PLAYER_X,

round(playerY)

);

drawPaddle(

CPU_X,

round(cpuY)

);

drawBall();

// ---------------------------------------------------

// CUSTOM CHARACTER MANAGEMENT

// ---------------------------------------------------

byte patterns[8][8];

byte patternCount = 0;

byte characterNumber[16];

bool hasPattern[16];

for (

byte i = 0;

i < 16;

i++

) {

characterNumber[i] = 0;

hasPattern[i] = false;

}

// ---------------------------------------------------

// FIND UNIQUE PATTERNS

// ---------------------------------------------------

for (

byte x = 0;

x < 16;

x++

) {

bool empty = true;

for (

byte y = 0;

y < 8;

y++

) {

if (

screenBuffer[x][y] != 0

) {

empty = false;

break;

}

}

if (empty) {

continue;

}

int found = -1;

for (

byte p = 0;

p < patternCount;

p++

) {

bool same = true;

for (

byte y = 0;

y < 8;

y++

) {

if (

patterns[p][y] !=

screenBuffer[x][y]

) {

same = false;

break;

}

}

if (same) {

found = p;

break;

}

}

if (

found == -1 &&

patternCount < 8

) {

for (

byte y = 0;

y < 8;

y++

) {

patterns[patternCount][y] =

screenBuffer[x][y];

}

characterNumber[x] =

patternCount;

hasPattern[x] =

true;

patternCount++;

} else {

characterNumber[x] =

found;

hasPattern[x] =

true;

}

}

// ---------------------------------------------------

// LOAD CUSTOM CHARACTERS

// ---------------------------------------------------

for (

byte i = 0;

i < patternCount;

i++

) {

lcd.createChar(

i,

patterns[i]

);

}

// ---------------------------------------------------

// DRAW TOP ROW

// ---------------------------------------------------

for (

byte x = 0;

x < 16;

x++

) {

lcd.setCursor(

x,

0

);

if (

hasPattern[x]

) {

lcd.write(

characterNumber[x]

);

} else {

lcd.print(

" "

);

}

}

// ---------------------------------------------------

// BOTTOM SCORE

// ---------------------------------------------------

lcd.setCursor(

0,

1

);

lcd.print(

"P:"

);

lcd.print(

playerScore

);

lcd.print(

" C:"

);

lcd.print(

cpuScore

);

lcd.print(

" T:"

);

lcd.print(

lifetimeScore

);

}

// =====================================================

// GET AI NAME

// =====================================================

void getAIName(

char *name

) {

switch (

aiDifficulty

) {

case 1:

strcpy(

name,

"EASY"

);

break;

case 2:

strcpy(

name,

"NORMAL"

);

break;

case 3:

strcpy(

name,

"HARD"

);

break;

case 4:

strcpy(

name,

"EXPERT"

);

break;

case 5:

strcpy(

name,

"INSANE"

);

break;

}

}

// =====================================================

// SHOW MENU

// =====================================================

void showMenu() {

gameRunning = false;

lcd.clear();

char aiName[7];

getAIName(

aiName

);

// ---------------------------------------------------

// TOP ROW

// ---------------------------------------------------

lcd.setCursor(

0,

0

);

lcd.print(

"AI:"

);

lcd.print(

aiName

);

lcd.print(

" T:"

);

lcd.print(

lifetimeScore

);

// ---------------------------------------------------

// BOTTOM ROW

// ---------------------------------------------------

lcd.setCursor(

0,

1

);

lcd.print(

"A/B AI D START"

);

}

// =====================================================

// MENU LOOP

// =====================================================

void menuLoop() {

char key =

keypad.getKey();

if (!key) {

return;

}

// ===================================================

// DECREASE AI DIFFICULTY

// ===================================================

if (

key == 'A'

) {

if (

aiDifficulty > 1

) {

aiDifficulty--;

}

showMenu();

delay(150);

return;

}

// ===================================================

// INCREASE AI DIFFICULTY

// ===================================================

if (

key == 'B'

) {

if (

aiDifficulty < 5

) {

aiDifficulty++;

}

showMenu();

delay(150);

return;

}

// ===================================================

// START GAME

// ===================================================

if (

key == 'D'

) {

waitForKeyRelease();

startGame();

return;

}

}

// =====================================================

// CONFIGURE AI

// =====================================================

void configureAI() {

switch (

aiDifficulty

) {

// -------------------------------------------------

// EASY

// -------------------------------------------------

case 1:

aiReactionDelay = 600;

aiMoveAmount = 0.25;

aiAccuracy = 35;

ballSpeed = 0.60;

break;

// -------------------------------------------------

// NORMAL

// -------------------------------------------------

case 2:

aiReactionDelay = 450;

aiMoveAmount = 0.35;

aiAccuracy = 50;

ballSpeed = 0.70;

break;

// -------------------------------------------------

// HARD

// -------------------------------------------------

case 3:

aiReactionDelay = 300;

aiMoveAmount = 0.50;

aiAccuracy = 65;

ballSpeed = 0.80;

break;

// -------------------------------------------------

// EXPERT

// -------------------------------------------------

case 4:

aiReactionDelay = 180;

aiMoveAmount = 0.70;

aiAccuracy = 82;

ballSpeed = 0.95;

break;

// -------------------------------------------------

// INSANE

// -------------------------------------------------

case 5:

aiReactionDelay = 100;

aiMoveAmount = 0.85;

aiAccuracy = 94;

ballSpeed = 1.05;

break;

}

}

// =====================================================

// RESET BALL

// =====================================================

void resetBall(

bool towardPlayer

) {

ballX = 40;

ballY =

random(

1,

7

);

if (

towardPlayer

) {

ballDX =

-ballSpeed;

} else {

ballDX =

ballSpeed;

}

if (

random(

0,

2

) == 0

) {

ballDY =

0.20;

} else {

ballDY =

-0.20;

}

}

// =====================================================

// PLAYER CONTROLS

// =====================================================

void readPlayerControls() {

char key =

keypad.getKey();

if (!key) {

return;

}

// UP

if (

key == '1'

) {

playerY -= 1;

if (

playerY < 0

) {

playerY = 0;

}

}

// DOWN

if (

key == '4'

) {

playerY += 1;

if (

playerY >

SCREEN_HEIGHT -

PADDLE_HEIGHT

) {

playerY =

SCREEN_HEIGHT -

PADDLE_HEIGHT;

}

}

// MENU

if (

key == '*'

) {

gameRunning = false;

waitForKeyRelease();

showMenu();

}

}

// =====================================================

// CPU AI

// =====================================================

void updateCPU() {

if (

millis() -

lastAIUpdate <

aiReactionDelay

) {

return;

}

lastAIUpdate =

millis();

// Only react when ball is coming toward CPU.

if (

ballDX <= 0

) {

return;

}

float targetY =

ballY;

// AI can make mistakes.

if (

random(

0,

100

) >

aiAccuracy

) {

targetY +=

random(

-2,

3

);

}

float cpuCenter =

cpuY +

PADDLE_HEIGHT / 2.0;

// Move down

if (

targetY >

cpuCenter

) {

cpuY +=

aiMoveAmount;

}

// Move up

if (

targetY <

cpuCenter

) {

cpuY -=

aiMoveAmount;

}

// Keep CPU on screen.

if (

cpuY < 0

) {

cpuY = 0;

}

if (

cpuY >

SCREEN_HEIGHT -

PADDLE_HEIGHT

) {

cpuY =

SCREEN_HEIGHT -

PADDLE_HEIGHT;

}

}

// =====================================================

// BALL UPDATE

// =====================================================

void updateBall() {

ballX +=

ballDX;

ballY +=

ballDY;

// ---------------------------------------------------

// TOP WALL

// ---------------------------------------------------

if (

ballY <= 0

) {

ballY = 0;

ballDY =

abs(ballDY);

}

// ---------------------------------------------------

// BOTTOM WALL

// ---------------------------------------------------

if (

ballY >=

SCREEN_HEIGHT - 1

) {

ballY =

SCREEN_HEIGHT - 1;

ballDY =

-abs(ballDY);

}

// ---------------------------------------------------

// PLAYER PADDLE

// ---------------------------------------------------

if (

ballDX < 0 &&

ballX <= PLAYER_X + 1 &&

ballX >= PLAYER_X - 1

) {

if (

ballY >= playerY &&

ballY <

playerY + PADDLE_HEIGHT

) {

ballX =

PLAYER_X + 1;

ballDX =

abs(ballDX);

float hitPosition =

ballY -

(

playerY +

PADDLE_HEIGHT / 2.0

);

ballDY =

hitPosition * 0.30;

increaseBallSpeed();

}

}

// ---------------------------------------------------

// CPU PADDLE

// ---------------------------------------------------

if (

ballDX > 0 &&

ballX >= CPU_X - 1 &&

ballX <= CPU_X + 1

) {

if (

ballY >= cpuY &&

ballY <

cpuY + PADDLE_HEIGHT

) {

ballX =

CPU_X - 1;

ballDX =

-abs(ballDX);

float hitPosition =

ballY -

(

cpuY +

PADDLE_HEIGHT / 2.0

);

ballDY =

hitPosition * 0.30;

increaseBallSpeed();

}

}

// ===================================================

// PLAYER SCORES

// ===================================================

if (

ballX >= SCREEN_WIDTH

) {

playerScore++;

// Lifetime score increases permanently.

addLifetimePoint();

resetBall(false);

return;

}

// ===================================================

// CPU SCORES

// ===================================================

if (

ballX < 0

) {

cpuScore++;

resetBall(true);

return;

}

}

// =====================================================

// INCREASE BALL SPEED

// =====================================================

void increaseBallSpeed() {

float direction;

if (

ballDX > 0

) {

direction = 1;

} else {

direction = -1;

}

float speed =

abs(ballDX);

speed +=

0.025;

float maximumSpeed;

switch (

aiDifficulty

) {

case 1:

maximumSpeed = 0.90;

break;

case 2:

maximumSpeed = 1.00;

break;

case 3:

maximumSpeed = 1.15;

break;

case 4:

maximumSpeed = 1.30;

break;

default:

maximumSpeed = 1.45;

break;

}

if (

speed >

maximumSpeed

) {

speed =

maximumSpeed;

}

ballDX =

direction *

speed;

}

// =====================================================

// START GAME

// =====================================================

void startGame() {

configureAI();

playerScore = 0;

cpuScore = 0;

playerY = 2;

cpuY = 2;

resetBall(true);

lastAIUpdate =

millis();

lastFrame =

millis();

gameRunning = true;

lcd.clear();

renderGame();

}

// =====================================================

// GAME OVER

// =====================================================

void gameOver() {

gameRunning = false;

lcd.clear();

if (

playerScore >=

WIN_SCORE

) {

lcd.setCursor(

0,

0

);

lcd.print(

"YOU WIN!"

);

} else {

lcd.setCursor(

0,

0

);

lcd.print(

"CPU WINS"

);

}

lcd.setCursor(

0,

1

);

lcd.print(

"P:"

);

lcd.print(

playerScore

);

lcd.print(

" C:"

);

lcd.print(

cpuScore

);

lcd.print(

" T:"

);

lcd.print(

lifetimeScore

);

delay(1800);

showMenu();

}

// =====================================================

// WAIT FOR KEY RELEASE

// =====================================================

void waitForKeyRelease() {

while (

keypad.getKey()

) {

delay(10);

}

}

// =====================================================

// SETUP

// =====================================================

void setup() {

lcd.begin(

16,

2

);

randomSeed(

analogRead(A5)

);

loadLifetimeScore();

showMenu();

}

// =====================================================

// MAIN LOOP

// =====================================================

void loop() {

// ---------------------------------------------------

// MENU

// ---------------------------------------------------

if (!gameRunning) {

menuLoop();

return;

}

// ---------------------------------------------------

// PLAYER

// ---------------------------------------------------

readPlayerControls();

if (!gameRunning) {

return;

}

// ---------------------------------------------------

// CPU

// ---------------------------------------------------

updateCPU();

// ---------------------------------------------------

// GAME FRAME

// ---------------------------------------------------

if (

millis() -

lastFrame >=

45

) {

lastFrame =

millis();

updateBall();

// -------------------------------------------------

// WIN

// -------------------------------------------------

if (

playerScore >=

WIN_SCORE

) {

gameOver();

return;

}

// -------------------------------------------------

// CPU WIN

// -------------------------------------------------

if (

cpuScore >=

WIN_SCORE

) {

gameOver();

return;

}

renderGame();

}

}


r/arduino 2d ago

Mod's Choice! I made a library that lets you configure ESP32 projects with a simple graphical interface. No more hard-coding Wi-Fi credentials!

Post image
17 Upvotes

Every project I work on, I get really tired of either having to hard-code settings or write out the code to handle them via Serial. So, I put together this library, ESP-Config, that takes care of all of that for me automatically!

The library lets you configure settings, commands, and information in your project asynchronously, and then those are passed to your computer running a basic UI. From there, you can monitor your project, change settings, and interface with it directly.

The config code runs in its own FreeRTOS task in the background, so you can do basically anything else in your main code without having to worry about the config. This includes using blocking code, the library will have no issue with that.

The ESP32 holds all the info on how the content should be structured and presented; the program on your computer is completely generic. So, you can set up your ESP32 to do basically anything without ever having to touch the code on the computer!

The settings, commands, and info can all be dynamically created, modified, and destroyed as needed, letting your settings adapt to your project. For instance, scanning for Wi-Fi networks in range can re-populate the list of networks available to connect to, for you to select.

More advanced features, like password-protecting certain (or all) settings/commands, are available as well.

Check out the GitHub for more info; https://github.com/JimHeaney/ESP-Config


r/arduino 2d ago

ATtiny85 Tinyjoypad Waternet game, can anyone test it on real hardware ?

1 Upvotes

Hi,

I ported my waternet arduboy game to the attiny85 tinyjoypad device. I don't own a tinyjoypad device myself so i could not test it on real hardware, is anyone willing to test it on real hardware ?

I did test it on wokwi by adding the source code to a hardware project someone made to make tinyjoypad games work in wokwi and there it was working, but that's still not real hardware.

i really would love to see a video of it running on real hardware if it runs at all

In case someone is interest that link is here: https://wokwi.com/projects/473716728876716033

The repo for the waternet tinyjoypad version is here: https://github.com/joyrider3774/waternet_tinyjoypad


r/arduino 2d ago

Music Synch RGB LED for car

2 Upvotes

Hi! i’m a bit new to arduino‘s world but i can code a bit and i have a question (sorry for my bad english but i’m italian).

I want to do a project. I alr bought an ambient rgb led stripe , the one on amazon that comes with the usb “controller” and it had a function for music synch but it was controlled with a mic and my car is noisy so i connected the led to arduino NANO and i wanted it to synchronize with my radio, but i don’t know how , i think i have to do like a filter for the RCA output of my radio to go to arduino and then i have to program it to do somethink with the information that the RCA give to it . But i dont know how to make this “filter”.

My final result want to be like a led that synchronized with my radio ( i don’t want to put a microphone so that all the noise dont activate the led ) , is it possible? i saw people doing it but i don‘t know how.If you didn‘t understand it well you can ask me.

If you know please respond i would be over the moon thank you early!


r/arduino 2d ago

Hardware Help Driver Signal Question

Thumbnail
gallery
4 Upvotes

I have a question about providing signals from the arduino to the stepper drivers. I am running an Uno R3 with a Prototype Shield V5, and 2 Nema 34 Steppers with DM860I drivers. During my testing, I had one connection on the prototype shield and then split the wires going to the drivers. To finalize things, I soldered JST-XH connectors to the prototype shield but when making all tbe connections I soldered in place 2 connectors for the drivers instead of one. So now I'm wondering if it really makes any difference between having a single connection at the uno and having wires that split, or having 2 separate connections.


r/arduino 2d ago

Software Help Windows 10 not detecting BLE esp32 S3 Zero

2 Upvotes

I was making a diy usb + BLE macropad from a guide I found online. Technically I had everything to make it work rather easily, but then I hit a wall. The code used this library: https://github.com/gsgaurav0/ESP32-HID-Keyboard. When I went into bluetooth settings in windows and clicked add devices, the esp32 did not show up in any of the 3 categories. Then I switched the library to this one: https://github.com/HijelHub/HijelHID_BLEKeyboard, and flashed the default example code. This did not work either. I am using a waveshare ESP32 S3 Zero. I checked my iphone, in both cases the device showed up on the bluetooth device list, so something is wrong on my pc. I definitely have the right bluetooth card/module, I made sure of it when I rebuilt my pc recently. As you can guess im new to this, so probably some setup step was not described in the guide, or its just windows as usual.


r/arduino 2d ago

Hardware Help Help with MAX7219 8x8 modules

3 Upvotes

I have 14 MAX7219 chained together and when i upload my code to my arduino uno, some modules don't turn on and anothers have the wrong brightness. I had already checked my code various times but is fine. I tried interchanging modules positions trying to find if there is a burnt one. One thing I noticed is that when I chain a small amount of them (Ex: 4 modules), they work fine, but sometimes they just do the same things like if there were 14 again. If someone know what causes this or had an similar experience please let me know.


r/arduino 3d ago

Project Update! I added automatic force-feedback calibration to my guitar robot

Enable HLS to view with audio, or disable this notification

44 Upvotes

The robot uses force feedback to find the correct fretting position automatically, so there’s no need to manually tune each servo position.

One tap starts the calibration, then it adjusts itself and gets ready to play.

I’m still refining the process, but it’s already made setup much easier.


r/arduino 2d ago

Good morning...

2 Upvotes

I’m using two BPW34 photodiodes. One is connected directly to an Arduino, and its readings behave correctly: the reading increases when I bring a light source closer and decreases when I move it farther away.

The second BPW34 is connected to an LM358 configured as a transimpedance amplifier to convert the photodiode’s current into a measurable voltage. I’m using a 1 MΩ feedback resistor and tried 10 pF, 22 pF, and 101 pF capacitors, but the LM358 circuit is not giving a logical or stable reading.

What could be causing the problem?

The code:

void setup() {

Serial.begin(9600);

}

void loop() {

int sensorA0 = analogRead(A0);

int sensorA5 = analogRead(A5);

Serial.print("A0: ");

Serial.print(sensorA0);

Serial.print(" A5: ");

Serial.println(sensorA5);

delay(2000);

}

The way i connected the lm:

Pin 1 (OUT) → Arduino A0

Pin 2 (−) → BPW34 Cathode

Pin 3 (+) → GND

Pin 4 (GND) → GND

Pin 8 (V+) → +5V

With a 1mohm resistor between pin 1 and 2 with the capacitor

I'm sorry I can't take a photo of the way i connect it because it's such a mess of wires

And i have 8 leds and a dht221 connected if that may help


r/arduino 3d ago

is my terrible soldering the reason my DRV8871 IN1 pin is reading a constant 0.1V?

Thumbnail
gallery
22 Upvotes

Hi all, first time soldering so go easy on me - My arduino nano is gradually increasing an output voltage on different PWM pins as a test code for my motor driver baord. First I tried jankily holding the wires to the board, and my 12V motor wouldnt spin. I finally assumed the connections were bad so I tried soldering, and it isnt pretty but nothing is touching and everything is secure.

I broke out the multimeter and tested everything - I am pretty confident the DRV8871 is not fried, the code is simple and correct, but for some reason the IN1 pin reads a constant 0.1V while the IN2 pin reads 0-4.7V (which is close enough to correct). the motor output 1 is staying at 12V, while output 2 is varying between 0 and 12.


r/arduino 3d ago

Hardware Help How can I connect this, if its even possible, to an Arduino (or any processor for that matter) ?

Thumbnail
gallery
50 Upvotes

I had this old Huawei Watch GT2 that didn't work. So I opened it up, in hopes of being able to get to the screen to use for one of my projects. I want to make a wearable screen necklace so I only need the screen, a arduino and a battery to power it (and a USB-C to charge it). Before I even begin, is it even possible? I really want to make this work before I buy a ESP32 round screen thing (or a round screen for that matter). How do I conenct this to an Arduino? I kept all of its components in case I need to connect it to one of them. Is it possible? Or am I better off throwing it into the trash? Also, the battery of the Watch doesn't work, so I can't do anything untill I buy a replacment, which I'll do as soon as I know I can turn it into a necklace.

the screen is connected to a module, which I have no idea of what it does, via 2 countless pin thingis... Any way I can connect that to a Arduino? Or the module its attached to? Or anything for that matter?

side note: is there a way to get the screen out of its titanium shell? I tried with hot air gun to soften the glue, it doesn't even bulge. No screws as you can see in the photo, already took them off. I can work with even with the shell, but it'd be nice to only have the scren


r/arduino 4d ago

Look what I made! I built a 3D printed, walking Arduino Hexapod!

Enable HLS to view with audio, or disable this notification

1.4k Upvotes

Printed from PLA, powered from a 3s LiPo and controlled with Arduino UNO.

It has adjustable walking speed, stride length, and can turn in place or while walking (not sure how useful that is since it is omnidirectional).

The controller uses an Arduino NANO, but you can’t see it from this vid.

Here's the github repo: https://github.com/LouisD18/18-DOF-Hexapod


r/arduino 3d ago

Is this 7 segment display dead

Post image
29 Upvotes

I’m asking to be sure tried, connecting all the pins to 5V, all resistors are 220s only E,D,C DP lights up before F,A,B was also lighting up but now not.


r/arduino 3d ago

Hardware Help Problem with nRF24L01 connected via a long cable.

Thumbnail
gallery
10 Upvotes

Hello everyone, this is a follow-up to my previous post: "Remote-controlled submarine problem."

Regarding the center of gravity, I adjusted it manually as you recommended.

Also, for the nRF24L01 radio communication, I created a float connected by a cable over 1.5 meters long; however, after several tests, the communication cuts out. Even though the connections are correct and cable resistance is negligible, the SCK and MISO pins aren't working. I suspect the clock signal is being disrupted, though I have no idea why.

Finally, despite all my research, I’m turning to you for a solution, bearing in mind that I cannot connect the submarine directly to my controller. Thank you very much in advance, as well as for the comments on my last post. Please don't hesitate to ask if you need any further information or photos.


r/arduino 3d ago

Beginner's Project I want to make an Obstacle Avoiding Robo car [ Need help! ]

Thumbnail
gallery
16 Upvotes

Are these okay and enough ?

I took help from chatgpt before ordering

And I also want to get to know more about this from someone who done this before 🫪


r/arduino 3d ago

Noise reduction of a low-light measuring device.

Post image
4 Upvotes

Hello,

im having problems with my device which im using for a low-light fluorescence signal measuring. I oftentimes find myself having variation in my signal from measurement to measurement and also inside single measurements. Sometimes the signal just drops to half of what its supposed to be.

The circuit diagram is attached, sorry ist really messy.

My question is, how can i improve this circuit and make it more stable and increase the SNR?

MICROFC-SMTPA-30035-GEVB is a SIPM.

XL6009 is a step up DC-DC Converter.

(I tryed many different setups before including a TIA, non-inverting amplifier etc. but i found a simple shunt resisitor to have the best SNR (though i only used a OP07 as a OPA))


r/arduino 3d ago

Hardware Help Display prism glasses

Post image
2 Upvotes

Hi everyone,

I'm planning a DIY prism glasses project and found this 0.2" FLCOS micro-display module (720x540 resolution, CVBS/AV input, around 200 cd/m² brightness).

Before buying, I have a few questions for anyone who has worked with similar displays:

Brightness & Optics: Is 200 cd/m² bright enough when paired with a beamsplitter/prism for indoor use, or will the image be too washed out?

Signal & Driver: It accepts analog AV/CVBS input. Is converting standard micro-controller/Raspberry Pi display signals (HDMI/SPI) to AV worth the hassle, or should I look for an HDMI-native micro OLED instead?

Image Quality: How is the text clarity at 720x540 on a 0.2-inch panel?

Any advice, experiences, or alternative display suggestions would be greatly appreciated!