Arduino Nano 控制夹爪的仓库,包含 L298N 步进驱动、力敏电阻、限位开关和启动回零逻辑
仓库:https://github.com/norkator/nano-l298n-gripper-driver.git
硬件复现清单
Arduino Nano L298N 电机驱动模块 小型两相步进电机 薄膜压力传感器 FSR 限位开关 普通按键 电阻,建议先用 10 kΩ 外部电机电源 杜邦线程序整体运行流程
1. 上电 2. 执行 homing:夹爪完全闭合直到碰到限位,然后完全打开 3. 等待按钮按下,控制夹爪开/合完整程序
/* * L298N stepper driver gripper tester (Nano) ATmega328p * nano, gripper, film pressure sensor, homing switch, open close gipper push button */ // ## Libraries ## #include <Stepper.h> // ######################## // ## PIN CONFIGURATIONS ## // ######################## int motorA1 = 2; // stepper A1 int motorA2 = 3; // stepper A2 int motorB1 = 4; // stepper B1 int motorB2 = 5; // stepper B2 int endStopPin = 7; // 回零限位开关 int toggleBtnPin = 12; // 开合切换按钮 int firmPressurePin = A0; // FSR压力传感器模拟输入 // Variables const int stepsPerRevolution = 200; // 电机一圈 200 步 Stepper myStepper(stepsPerRevolution, motorA1, motorA2, motorB1, motorB2); // 直接用 Arduino 四个 IO 控制 L298N 的四个输入 const int stepperMotorSpeed = 150; // 电机转速 rpm const int gripperStepsFullyOpen = -1700; // 回零后全开需要反向1700步 boolean homingDone = false; // 开机回零完成标志 boolean gripperOpen = true; // 夹爪逻辑状态:默认打开 boolean gripperClosed = false; int gripPressureValue = 0; // FSR实时压力读数 int currentStepPosition = 0; // 当前夹爪相对全开位置的步数偏移 int gripPressureLimit = 800; // 夹持压力上限,超过停止夹紧 // SETUP void setup() { // Init serial Serial.begin(9600); //开启串口 9600 波特 // Init stepper myStepper.setSpeed(stepperMotorSpeed); // Pin modes 打印回零、调试信息 pinMode(endStopPin, INPUT_PULLUP); pinMode(toggleBtnPin, INPUT_PULLUP); } // LOOP void loop() { if (!homingDone) { homing(); } readGripperPressure(); // 按键按下翻转目标状态 int tInputVal = digitalRead(toggleBtnPin); if (tInputVal == LOW) { gripperOpen = !gripperOpen; delay(1000); // wait so that toggle is not read again multiple times } // Gripper control 只有目标状态和当前实际状态不一致时,才执行运动 if (gripperOpen) { if (gripperClosed == true) { openGripper(); } } else { if (gripperClosed == false) { closeGripper(); } } turnOffStepper(); } /** * Homing procedure * 1. close gripper more till hit estop * 2. open gripper fully * 3. set homing done */ void homing() { Serial.println("Homing gripper..."); int steps = 0; int eStopVal = HIGH; while (eStopVal == HIGH) { eStopVal = digitalRead(endStopPin); myStepper.step(1); steps++; } Serial.print("Gripper endstop hit at "); Serial.print(steps); Serial.println(" steps.. gripper is fully closed"); myStepper.step(gripperStepsFullyOpen); // open fully currentStepPosition = gripperStepsFullyOpen; Serial.println("Gripper fully open, saving current position"); homingDone = true; } /** * */ void closeGripper() { int steps = 0; int eStopVal = HIGH; while (eStopVal == HIGH && gripPressureValue < gripPressureLimit) { readGripperPressure(); eStopVal = digitalRead(endStopPin); myStepper.step(1); steps++; } currentStepPosition = steps; gripperClosed = true; } /** * */ void openGripper() { myStepper.step(-currentStepPosition); gripperClosed = false; } /** * Turn off stepper driver * solves stepper driver overheating problem */ void turnOffStepper() { digitalWrite(motorA1, LOW); digitalWrite(motorA2, LOW); digitalWrite(motorB1, LOW); digitalWrite(motorB2, LOW); } /** * */ void readGripperPressure() { // Read firm pressure sensor (force sensing resistor?) gripPressureValue = analogRead(firmPressurePin); }项目启发
夹持 = 步进电机闭合 + 力敏传感器判断
复位 = 反向运动 + 限位开关判断
停止 = 达到压力 / 限位后停止