|Hacker实例:自动按YubiKeys( 三 )


先运行一个示例来使LED闪烁 , 以验证其是否正常工作:
void setup() { pinMode(LED, OUTPUT); } void loop() { digitalWrite(LED, LOW); delay(1000); digitalWrite(LED, HIGH); delay(1000); }然后是使用WiFi控制28BYJ-48步进电机的示例程序:
int Pin1 = D1; //IN1 is connected int Pin2 = D2; //IN2 is connected int Pin3 = D3; //IN3 is connected int Pin4 = D4; //IN4 is connected int pole1[] ={0,0,0,0, 0,1,1,1, 0}; //pole1, 8 step values int pole2[] ={0,0,0,1, 1,1,0,0, 0}; //pole2, 8 step values int pole3[] ={0,1,1,1, 0,0,0,0, 0}; //pole3, 8 step values int pole4[] ={1,1,0,0, 0,0,0,1, 0}; //pole4, 8 step values int poleStep = 0; int dirStatus = 3; String argId[] ={''ccw'', ''cw''}; ... void loop(void) { server.handleClient(); MDNS.update(); if (dirStatus == 1) { poleStep++; driveStepper(poleStep); } else if (dirStatus == 2) { poleStep--; driveStepper(poleStep); } else { driveStepper(8); } if (poleStep>7) { poleStep=0; } if (poleStep<0) { poleStep=7; } delay(1); } void motorControl() { if (server.arg(argId[0]) == ''on'') { dirStatus = 1; // CCW } else if (server.arg(argId[0]) == ''off'') { dirStatus = 3; // motor OFF } else if (server.arg(argId[1]) == ''on'') { dirStatus = 2; // CW } else if (server.arg(argId[1]) == ''off'') { dirStatus = 3; // motor OFF } } void driveStepper(int c) { digitalWrite(Pin1, pole1[c]); digitalWrite(Pin2, pole2[c]); digitalWrite(Pin3, pole3[c]); digitalWrite(Pin4, pole4[c]); }它的工作方式是Web服务器显示两个按钮:CCW(逆时针)和CW(顺时针) 。 如果这两个按钮中的任何一个都被切换 , 它将更改dirStatus为1(对于CCW)和2(对于CW) 。 如果该按钮处于关闭状态 , 它将变为dirStatus3以停止电动机 。
您可以在loop()函数中看到正在检查它是dirStatus增加poleStep(直到它循环) , 减小(直到它循环)或完全停止 。
相反 , 想要的是一个HTTP接口 , 它将使电动机逆时针移动 , 直到碰到Yubikey , 然后顺时针旋转以收回 , 然后停止 。
因此 , 可以将motorControl()函数重写为:
void motorControl() { dirStatus = 1; // CCW }当调用HTTP接口时 , 它将开始逆时针移动电动机 。
然后 , 我们修改loop()函数以移动400步 , 将方向更改为CW , 然后沿该方向移动400步 , 然后停止 。
int steps = 0; void loop(void) { server.handleClient(); MDNS.update(); if (dirStatus == 1) { poleStep++; driveStepper(poleStep); steps++; } else if (dirStatus == 2) { poleStep--; driveStepper(poleStep); steps++; } else { driveStepper(8); } if (poleStep>7) { poleStep=0; } if (poleStep<0) { poleStep=7; } if (steps > 400) { if (dirStatus == 1) { dirStatus = 2; // CW } else { dirStatus = 3; // motor OFF } steps = 0; } delay(1); }关于Finger的物理设计的一件好事是 , 它非常宽容:电机不是很坚固 , 因此一旦碰到YubiKey , 它就可以继续逆时针方向转动而不会损坏任何东西 。 当顺时针旋转时 , 最终从手指伸出的骨头会撞到底座的边缘 , 从而防止其掉落到右侧 。 从steps最大极限开始 , 然后进行了手动测试 , 每次降低一点 , 直到找到400个台阶的最佳点 。
然后 , 我检查了WiFi板的MAC地址 , 在路由器上为其进行了静态IP映射 , 并对其进行了本地DNS记录finger.localdomain 。
现在 , 如果调用finger.localdomain/press , 电动机将把手指推向YubiKey并缩回 。


推荐阅读