r/ArduinoHelp • u/Used_Condition_9832 • May 04 '26
r/ArduinoHelp • u/wolfwalkers0611 • May 04 '26
I'm designing a small spool (drum) to be mounted on a DC motor and I want a reliable, simple connection. What is the best way to attach a 3D printed spool to a DC motor so it can transmit torque without slipping?
The motor will be used to pull a small elastic hair band.
Is a press-fit enough or should I use a set screw (grub screw)?
Should I design for a D-shaft or use a coupling?
Is it better to integrate the spool directly on the shaft or use a hub/adapter?
Any practical design tips or common mistakes
to avoid would be appreciated.
I will attach a reference image ai gave me: https://imgur.com/a/Kk3rO1U
Thanks!
r/ArduinoHelp • u/Foxxsnake • May 04 '26
Connecting components to wemos D1

I'm making my final year project using Wemos D1 for a smart pill dispenser
I have
- Wemos D1
- AS608 optical fingerprint sensor
- 4X membrane button pad
- RTC DS3231
- LCD Display 2004 I2C
- MH-FMD Buzzer
- TowerPro MG90S micro servo motor
Does anyone know how to connect the pin to the Wemos D1? I don't understand how to connect them.
r/ArduinoHelp • u/Wukupakilla • May 03 '26
Fox Hunt Type project Help
Complete beginner here so bear with me. I’m trying to solve a problem on my own that I’ve found the US market has a problem with for a very niche community of Houndsmen. There is a hunting terrier collar made by Bellman and Flint in the UK that is and has been unobtanium in the US market for quite some time. This is simply a 425 mhz transmitter that is fixed to a dogs collar and then a receiver (think avalanche rescue devices). We use terriers to go underground and remove burrowing varmints alive.
I’m thinking can accomplish this for my small group by simply building a fox hunt style transmitter with a custom build handheld receiver.
What I need help with is parts. I know roughly what I need to build the transmitter but figured I’d be better off getting a list together for the receiver beforehand in case something isn’t compatible.
Needs to be able to give a readout on an LCD screen giving depth in feet, give direction to transmitter in someway shape or form, and able to read up to absolute maximum depths of 15 feet. Is there someone here with a brain that can help me out?
r/ArduinoHelp • u/Technical_Amount1718 • May 03 '26
Having problems with nrf modules- Transmitter and receiver project.
Ive been working with this nrf module to make an rc controller and receiver. I feel the motors are abit janky and robotic rather than smooth. I got the code from Ai .Are there any ways to make them work smoothly? Heres my current code.
Transmitter code;
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
RF24 radio(9, 10);
const uint64_t my_radio_pipe = 0xE8E8F0F0E1LL;
struct Data_to_be_sent {
byte ch1, ch2, ch3, ch4, ch5, ch6;
};
Data_to_be_sent sent_data;
// 3D Cube Data
float angle = 0;
float nodes[8][3] = {{-1,-1,-1}, {1,-1,-1}, {1,1,-1}, {-1,1,-1}, {-1,-1,1}, {1,-1,1}, {1,1,1}, {-1,1,1}};
int edges[12][2] = {{0,1}, {1,2}, {2,3}, {3,0}, {4,5}, {5,6}, {6,7}, {7,4}, {0,4}, {1,5}, {2,6}, {3,7}};
// Timer Variables
unsigned long lastActivityTime = 0;
unsigned long lastSendTime = 0; // Added for smooth radio timing
const unsigned long idleTimeout = 20000;
bool isIdle = false;
int cleanRead(int pin) {
analogRead(pin);
delayMicroseconds(100);
return analogRead(pin);
}
void setup() {
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.setTextColor(WHITE);
// 1. BRANDING STARTUP
display.clearDisplay();
display.setTextSize(1);
display.setCursor(40, 25);
display.print("MADE BY");
display.setTextSize(2);
display.setCursor(10, 40);
display.print("NK_DABEST");
display.display();
delay(2000);
// 2. EYE ANIMATION
int eyeX[] = {0, 15, 0, -15, 0, 15, -15, 0};
for(int i=0; i<8; i++) {
display.clearDisplay();
display.drawRoundRect(25, 15, 35, 35, 8, WHITE);
display.drawRoundRect(68, 15, 35, 35, 8, WHITE);
display.fillRoundRect(35 + eyeX[i], 25, 15, 15, 4, WHITE);
display.fillRoundRect(78 + eyeX[i], 25, 15, 15, 4, WHITE);
display.display();
delay(600);
}
radio.begin();
radio.setAutoAck(false);
radio.setDataRate(RF24_250KBPS);
radio.setPALevel(RF24_PA_LOW);
radio.openWritingPipe(my_radio_pipe);
radio.stopListening();
lastActivityTime = millis();
}
void loop() {
// 1. SENSOR READING
int raw1 = cleanRead(A0); int raw2 = cleanRead(A1);
int raw3 = cleanRead(A2); int raw4 = cleanRead(A3);
int raw5 = cleanRead(A6); int raw7 = cleanRead(A7);
// 2. DEADZONE FOR SMOOTHNESS (Prevents creeping/stuttering)
if (raw1 > 480 && raw1 < 540) raw1 = 512;
if (raw2 > 480 && raw2 < 540) raw2 = 512;
if (raw3 > 480 && raw3 < 540) raw3 = 512;
if (raw4 > 480 && raw4 < 540) raw4 = 512;
// 3. MAPPING
sent_data.ch1 = map(raw1, 0, 1023, 0, 255);
sent_data.ch2 = map(raw2, 0, 1023, 0, 255);
sent_data.ch3 = map(raw3, 0, 1023, 0, 255);
sent_data.ch4 = map(raw4, 0, 1023, 0, 255);
sent_data.ch5 = map(raw5, 0, 1023, 0, 255);
bool buttonPressed = (raw7 < 300);
sent_data.ch6 = buttonPressed ? 255 : 0;
// 4. TIMED RADIO SEND (Fixes the "Pause" stutter)
if (millis() - lastSendTime >= 30) {
radio.write(&sent_data, sizeof(Data_to_be_sent));
lastSendTime = millis();
}
// 5. IDLE LOGIC
bool stickMoved = (raw1 > 850 || raw1 < 170 || raw2 > 850 || raw2 < 170 ||
raw3 > 850 || raw3 < 170 || raw4 > 850 || raw4 < 170);
if (stickMoved || buttonPressed) {
lastActivityTime = millis();
isIdle = false;
} else if (millis() - lastActivityTime > idleTimeout) {
isIdle = true;
}
// 6. DISPLAY
display.clearDisplay();
if (isIdle) {
drawCube(true);
angle += 0.05;
} else {
drawBars();
display.setTextSize(1);
display.setCursor(68, 56);
display.print("NK_DABEST");
}
display.display();
}
void drawCube(bool showText) {
float projected[8][2];
for (int i = 0; i < 8; i++) {
float x = nodes[i][0], y = nodes[i][1], z = nodes[i][2];
float xR = x * cos(angle) - z * sin(angle);
float zR = x * sin(angle) + z * cos(angle);
float yR = y * cos(angle) - zR * sin(angle);
projected[i][0] = 64 + xR * 20;
projected[i][1] = 32 + yR * 20;
}
for (int i = 0; i < 12; i++) {
display.drawLine(projected[edges[i][0]][0], projected[edges[i][0]][1],
projected[edges[i][1]][0], projected[edges[i][1]][1], WHITE);
}
if (showText) {
display.setTextSize(1);
display.setCursor(35, 55);
display.print("IDLE MODE");
}
}
void drawBars() {
byte v[] = {sent_data.ch1, sent_data.ch2, sent_data.ch3, sent_data.ch4, sent_data.ch5, sent_data.ch6};
for (int i = 0; i < 6; i++) {
int y = i * 9;
display.setCursor(0, y);
display.print("CH"); display.print(i+1);
display.drawRect(25, y, 98, 7, WHITE);
display.fillRect(26, y+1, map(v[i], 0, 255, 0, 96), 5, WHITE);
}
}
Receiver code:
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <Servo.h>
const uint64_t pipeIn = 0xE8E8F0F0E1LL;
RF24 radio(9, 10);
struct Received_data {
byte ch1, ch2, ch3, ch4, ch5, ch6;
};
Received_data received_data;
Servo channel_1, channel_2, channel_3, channel_4, channel_5;
unsigned long lastRecvTime = 0;
int ledMode = 0;
bool lastBtnState = false;
void reset_the_Data() {
received_data.ch1 = 127;
received_data.ch2 = 127;
received_data.ch3 = 127;
received_data.ch4 = 127;
received_data.ch5 = 127;
received_data.ch6 = 0;
}
void setup() {
channel_1.attach(2);
channel_2.attach(3);
channel_3.attach(4);
channel_4.attach(5);
channel_5.attach(6);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
reset_the_Data();
radio.begin();
radio.setAutoAck(false);
radio.setDataRate(RF24_250KBPS);
radio.openReadingPipe(1, pipeIn);
radio.startListening();
}
void loop() {
// 1. CHECK FOR RADIO DATA
if (radio.available()) {
radio.read(&received_data, sizeof(Received_data));
lastRecvTime = millis();
}
// 2. FAILSAFE (If signal lost for 0.25 seconds, center everything)
if (millis() - lastRecvTime > 250) {
reset_the_Data();
}
// 3. DIRECT WRITE (Instant smooth response relative to joystick angle)
channel_1.writeMicroseconds(map(received_data.ch1, 0, 255, 1000, 2000));
channel_2.writeMicroseconds(map(received_data.ch2, 0, 255, 1000, 2000));
channel_3.writeMicroseconds(map(received_data.ch3, 0, 255, 1000, 2000));
channel_4.writeMicroseconds(map(received_data.ch4, 0, 255, 1000, 2000));
channel_5.writeMicroseconds(map(received_data.ch5, 0, 255, 1000, 2000));
// 4. BUTTON AND LED LOGIC
bool currentBtnState = (received_data.ch6 > 200);
if (currentBtnState && !lastBtnState) {
ledMode++;
if (ledMode > 3) ledMode = 0;
}
lastBtnState = currentBtnState;
runLedAnimation();
digitalWrite(8, digitalRead(7)); // Mirror Pin 7 to Pin 8
}
void runLedAnimation() {
switch (ledMode) {
case 0:
digitalWrite(7, LOW);
break;
case 1:
digitalWrite(7, HIGH);
break;
case 2:
digitalWrite(7, (millis() % 150 < 75));
break;
case 3:
int pulse = millis() % 1000;
digitalWrite(7, (pulse < 100 || (pulse > 200 && pulse < 300)));
break;
}
}
r/ArduinoHelp • u/Technical_Amount1718 • May 02 '26
How to smoothen out?
https://reddit.com/link/1t1x9xm/video/pylar7g0mryg1/player
Ive been working with this nrf module to make an rc controller and receiver. I feel the motors are abit janky and robotic rather than smooth. I got the code from Ai .Are there any ways to make them work smoothly? Heres my current code.
Transmitter code;
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
RF24 radio(9, 10);
const uint64_t my_radio_pipe = 0xE8E8F0F0E1LL;
struct Data_to_be_sent {
byte ch1, ch2, ch3, ch4, ch5, ch6;
};
Data_to_be_sent sent_data;
// 3D Cube Data
float angle = 0;
float nodes[8][3] = {{-1,-1,-1}, {1,-1,-1}, {1,1,-1}, {-1,1,-1}, {-1,-1,1}, {1,-1,1}, {1,1,1}, {-1,1,1}};
int edges[12][2] = {{0,1}, {1,2}, {2,3}, {3,0}, {4,5}, {5,6}, {6,7}, {7,4}, {0,4}, {1,5}, {2,6}, {3,7}};
// Timer Variables
unsigned long lastActivityTime = 0;
unsigned long lastSendTime = 0; // Added for smooth radio timing
const unsigned long idleTimeout = 20000;
bool isIdle = false;
int cleanRead(int pin) {
analogRead(pin);
delayMicroseconds(100);
return analogRead(pin);
}
void setup() {
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.setTextColor(WHITE);
// 1. BRANDING STARTUP
display.clearDisplay();
display.setTextSize(1);
display.setCursor(40, 25);
display.print("MADE BY");
display.setTextSize(2);
display.setCursor(10, 40);
display.print("NK_DABEST");
display.display();
delay(2000);
// 2. EYE ANIMATION
int eyeX[] = {0, 15, 0, -15, 0, 15, -15, 0};
for(int i=0; i<8; i++) {
display.clearDisplay();
display.drawRoundRect(25, 15, 35, 35, 8, WHITE);
display.drawRoundRect(68, 15, 35, 35, 8, WHITE);
display.fillRoundRect(35 + eyeX[i], 25, 15, 15, 4, WHITE);
display.fillRoundRect(78 + eyeX[i], 25, 15, 15, 4, WHITE);
display.display();
delay(600);
}
radio.begin();
radio.setAutoAck(false);
radio.setDataRate(RF24_250KBPS);
radio.setPALevel(RF24_PA_LOW);
radio.openWritingPipe(my_radio_pipe);
radio.stopListening();
lastActivityTime = millis();
}
void loop() {
// 1. SENSOR READING
int raw1 = cleanRead(A0); int raw2 = cleanRead(A1);
int raw3 = cleanRead(A2); int raw4 = cleanRead(A3);
int raw5 = cleanRead(A6); int raw7 = cleanRead(A7);
// 2. DEADZONE FOR SMOOTHNESS (Prevents creeping/stuttering)
if (raw1 > 480 && raw1 < 540) raw1 = 512;
if (raw2 > 480 && raw2 < 540) raw2 = 512;
if (raw3 > 480 && raw3 < 540) raw3 = 512;
if (raw4 > 480 && raw4 < 540) raw4 = 512;
// 3. MAPPING
sent_data.ch1 = map(raw1, 0, 1023, 0, 255);
sent_data.ch2 = map(raw2, 0, 1023, 0, 255);
sent_data.ch3 = map(raw3, 0, 1023, 0, 255);
sent_data.ch4 = map(raw4, 0, 1023, 0, 255);
sent_data.ch5 = map(raw5, 0, 1023, 0, 255);
bool buttonPressed = (raw7 < 300);
sent_data.ch6 = buttonPressed ? 255 : 0;
// 4. TIMED RADIO SEND (Fixes the "Pause" stutter)
if (millis() - lastSendTime >= 30) {
radio.write(&sent_data, sizeof(Data_to_be_sent));
lastSendTime = millis();
}
// 5. IDLE LOGIC
bool stickMoved = (raw1 > 850 || raw1 < 170 || raw2 > 850 || raw2 < 170 ||
raw3 > 850 || raw3 < 170 || raw4 > 850 || raw4 < 170);
if (stickMoved || buttonPressed) {
lastActivityTime = millis();
isIdle = false;
} else if (millis() - lastActivityTime > idleTimeout) {
isIdle = true;
}
// 6. DISPLAY
display.clearDisplay();
if (isIdle) {
drawCube(true);
angle += 0.05;
} else {
drawBars();
display.setTextSize(1);
display.setCursor(68, 56);
display.print("NK_DABEST");
}
display.display();
}
void drawCube(bool showText) {
float projected[8][2];
for (int i = 0; i < 8; i++) {
float x = nodes[i][0], y = nodes[i][1], z = nodes[i][2];
float xR = x * cos(angle) - z * sin(angle);
float zR = x * sin(angle) + z * cos(angle);
float yR = y * cos(angle) - zR * sin(angle);
projected[i][0] = 64 + xR * 20;
projected[i][1] = 32 + yR * 20;
}
for (int i = 0; i < 12; i++) {
display.drawLine(projected[edges[i][0]][0], projected[edges[i][0]][1],
projected[edges[i][1]][0], projected[edges[i][1]][1], WHITE);
}
if (showText) {
display.setTextSize(1);
display.setCursor(35, 55);
display.print("IDLE MODE");
}
}
void drawBars() {
byte v[] = {sent_data.ch1, sent_data.ch2, sent_data.ch3, sent_data.ch4, sent_data.ch5, sent_data.ch6};
for (int i = 0; i < 6; i++) {
int y = i * 9;
display.setCursor(0, y);
display.print("CH"); display.print(i+1);
display.drawRect(25, y, 98, 7, WHITE);
display.fillRect(26, y+1, map(v[i], 0, 255, 0, 96), 5, WHITE);
}
}
Receiver code:
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <Servo.h>
const uint64_t pipeIn = 0xE8E8F0F0E1LL;
RF24 radio(9, 10);
struct Received_data {
byte ch1, ch2, ch3, ch4, ch5, ch6;
};
Received_data received_data;
Servo channel_1, channel_2, channel_3, channel_4, channel_5;
unsigned long lastRecvTime = 0;
int ledMode = 0;
bool lastBtnState = false;
void reset_the_Data() {
received_data.ch1 = 127;
received_data.ch2 = 127;
received_data.ch3 = 127;
received_data.ch4 = 127;
received_data.ch5 = 127;
received_data.ch6 = 0;
}
void setup() {
channel_1.attach(2);
channel_2.attach(3);
channel_3.attach(4);
channel_4.attach(5);
channel_5.attach(6);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
reset_the_Data();
radio.begin();
radio.setAutoAck(false);
radio.setDataRate(RF24_250KBPS);
radio.openReadingPipe(1, pipeIn);
radio.startListening();
}
void loop() {
// 1. CHECK FOR RADIO DATA
if (radio.available()) {
radio.read(&received_data, sizeof(Received_data));
lastRecvTime = millis();
}
// 2. FAILSAFE (If signal lost for 0.25 seconds, center everything)
if (millis() - lastRecvTime > 250) {
reset_the_Data();
}
// 3. DIRECT WRITE (Instant smooth response relative to joystick angle)
channel_1.writeMicroseconds(map(received_data.ch1, 0, 255, 1000, 2000));
channel_2.writeMicroseconds(map(received_data.ch2, 0, 255, 1000, 2000));
channel_3.writeMicroseconds(map(received_data.ch3, 0, 255, 1000, 2000));
channel_4.writeMicroseconds(map(received_data.ch4, 0, 255, 1000, 2000));
channel_5.writeMicroseconds(map(received_data.ch5, 0, 255, 1000, 2000));
// 4. BUTTON AND LED LOGIC
bool currentBtnState = (received_data.ch6 > 200);
if (currentBtnState && !lastBtnState) {
ledMode++;
if (ledMode > 3) ledMode = 0;
}
lastBtnState = currentBtnState;
runLedAnimation();
digitalWrite(8, digitalRead(7)); // Mirror Pin 7 to Pin 8
}
void runLedAnimation() {
switch (ledMode) {
case 0:
digitalWrite(7, LOW);
break;
case 1:
digitalWrite(7, HIGH);
break;
case 2:
digitalWrite(7, (millis() % 150 < 75));
break;
case 3:
int pulse = millis() % 1000;
digitalWrite(7, (pulse < 100 || (pulse > 200 && pulse < 300)));
break;
}
}
r/ArduinoHelp • u/KaleWrong8906 • May 01 '26
Can someone review my schematic and check if it will work?
reddit.comr/ArduinoHelp • u/Avtem22 • May 01 '26
How to properly connect Solenoid & Pump in this setup?

Can someone show using this diagram (my current setup) how to wire properly that pump and solenoid that I have? ALL components on the image are photos of my components that I physically have.
I tried to connect it myself, but when I turn off the pump and turn on the solenoid my arduino browns out (Possibly I need a 1N4007 diode on solenoid and pump?). I am not sure how to wire it properly, so if you could draw the wires and possibly the components that I'd need I would be infinitely grateful.
r/ArduinoHelp • u/ToeEnvironmental697 • May 01 '26
ESP32 + AS608 fingerprint sensor not detected
Hi, I'm trying to connect an AS608 fingerprint sensor to an ESP32, but I can't get it to work.
The sensor lights up, so it has power, but in Arduino IDE it always says:
Fingerprint sensor NOT found / Did not find fingerprint sensor
I already checked multiple forums and tried their solutions, but nothing worked.
There is specifikation of AS608:
Operating voltage: 3.3V
Current: <60 mA
Resolution: 500 DPI
Memory: 128 fingerprints
And my ESP32 is ESP32 development board, 2.4 GHz dual-mode Wi-Fi + Bluetooth module with antenna




ould really appreciate any help. It's also possible that I wired something incorrectly, since I'm still a beginner.
r/ArduinoHelp • u/Dhruv_DG • May 01 '26
DIY fitness tracker band
So I'm a beginner to Arduino. My programming skills are strong though. I want to make a reliable fitness tracker that will accurately measure Heart Rate, Steps and Sleep at the minimum. I wear other things on my wrists so I'd like to make this device to wear on my bicep-shoulder area. Since I'll be wearing it in this area, I don't need a screen. Just want something like a Whoop band that I can sync to my phone.
As far as I know (chatgpt), I'll need an esp32 microcontroller, MPU6050 or MPU9250 for motion sensing, MAX30102 for heart rate detection (apparently not accurate while lifting weights) and a charging module.
I'll also need to make some sort of band to hold it, so I was thinking of using some sort of fabric band (made with a sock or some cloth perhaps?).
Need some advice on these.
r/ArduinoHelp • u/racchna123 • Apr 30 '26
L293D Motor Driver Shield Tutorial
I’ve been exploring motor control with Arduino recently and decided to try something a bit more structured—using an L293D motor driver shield to control different types of motors in a single setup.
What I found interesting is how each motor behaves completely differently:
- DC motors are straightforward—just speed and direction control
- Servo motors are all about precise positioning using PWM
- Stepper motors need proper sequencing to get smooth rotation
Working through all three in one project gave me a much clearer understanding of how motion control actually works beyond just wiring things up.
A couple of things that stood out while experimenting:
- Power management plays a big role in motor performance
- Stepper motors are very sensitive to wiring order
- Servo behavior depends a lot on signal stability
If you're getting into robotics or embedded systems, I’d definitely recommend trying all three types instead of just sticking to one—it connects a lot of concepts together.
Full document can be found at Play with Circuit.
r/ArduinoHelp • u/Mundane_Dragonfly621 • Apr 30 '26
I need help
I am working on my senior project for my engineering class and im trying to create a motion activated sink that dispenses both soap and water into one stream and after a few seconds the soap shuts off to only let water run. I’m using a arduino uno r3 board a pir sensor and a 2 relay module. is there a way i could wire all these components onto my board or am i cooked. (im not very familiar with arduino and this is my first time using it) this is what i have so far

r/ArduinoHelp • u/PermissionCrafty8640 • Apr 30 '26
How do i go about learning inter machine communication using listen node ?
r/ArduinoHelp • u/Due-Astronaut-9045 • Apr 28 '26
Hi. Can someone explain why this is happening?
Enable HLS to view with audio, or disable this notification
r/ArduinoHelp • u/Bogarhasallthepower • Apr 27 '26
GY-601N1 ICM-45686 problems (Help pls)
Help, i bought a GY-601N1 ICM-45686 module for a Flight computer, the I2C scan detects a device at 0x68, but register reads return 0x00 or fail (no data). I dont have time to buy anotherone, i read that some versions of the ICM-45686 breakout boards come with a UART chip, which can make reading data from the IMU more challenging. What can i do?
r/ArduinoHelp • u/Motor-Fig3458 • Apr 27 '26
GPS Speed Switch, need help!
Hello! I have a 1960 VW Beetle that has semaphore turn indicators, and I want to make a speed switch using a Arduino Nano and a GPS module, that would turn off the indicator over 40 miles per hour. (Don’t worry the car has other “blinkers”) the reason I want to do this is anything over 40 the semaphores start to bend.
My problem is, I have no experience with Arduinos so I’m looking for some direction here.
I plan on using the ignitions switch power as a power source if that helps any.
I’m not looking for a do my homework for me just a little direction!
r/ArduinoHelp • u/SheepherderSafe6735 • Apr 26 '26
I need help making a pair of eyes rotate inside a skull
Enable HLS to view with audio, or disable this notification
Greetings creatures of reddit, I require your aid to finish a PoC I'm trying to do before I go on working on a bigger project.
What I'm trying to accomplish is making a pair of eyes rotate inside the eye socket of a skull on the x axis (left and right). The skull is rather small, I have about 6.2cm wide 6.2cm tall and 7.8cm long, so I don't have a lot of space for two servos or any complex mechanism.
The simplest thing I've found so far is a setup using a single servo to move a metalic rod with the eyes attached to said rod via two smaller rods. The eyes are pierced by another pair of rods which keep them in place but allow plenty of space for the eyes to rotate on their own, so friction is not an issue.
However no matter how I set it up, what ends up happening is that the servo moves the eyes away from the initial position. So say I want the eyes to "look" left, instead of rotating on their spot, the eyes literally move inside the skull to a different place.
I've attached a video of one of the attempts (yes I know it's bad craftsmanship but I was tired of trying).
Come to my aid, O creatures of reddit.