萌版蜘蛛侠:爬墙机器人DIY作品秀

想挣脱地心引力的束缚?想练习跑酷在垂直的墙壁上疾走?——不要用崇拜的目光注视我,虽然我就是飞檐走壁,仁者无敌的可爱玲珑wallbots!当然我也不介意你称呼我的艺名:【蜘蛛侠】
墙面上爬来爬去的是神马?!莫要惊慌,既不是壁虎也不是变异蜘蛛,它们是可爱的wallbots——能在垂直表面进行穿越的机器人。想知道怎么制作?嗯哼,往下看吧~小w可以在任何含金属墙面上移动,包括电梯,白板,冰箱、金属门。 小w还配备了几个光传感器,通过它们可以进行简单的交互。 3种模式可供选择,通过光传感器进行转换: 红色走得快,趋近障碍物(例如人的手或者小w的兄弟姐妹们); 绿色走得慢,远离障碍; 黄色走得最慢,检测到物体时完全停止。
1 工具和材料
● 一些不易弯曲的硬线
● 绝缘胶布
● 线
● 硬板纸
● 胶棒
● 热胶q1an9
● 剪刀
● 剪钳(绞线的那个)
●2.2k欧姆电阻*4
● 10k欧姆电阻
● 100欧姆电阻
● arduino mini(单片机)
● 伺服电机*2
● 磁铁片*6
● 1个rgb led灯
● 1个轻型的电池
2. 使伺服电机连续运转之入门篇
● 把固定它的壳子打开,对每个伺服机做简单修改就能得到我们需要的连续转动,先撬开壳子。
● 把妨碍转动的壳子剪掉,这样电位计就能一直获得连续信号。
● 这个黑色的部分是用来让它转了180度后停止的,看见没?两个黑色塑料小片儿。
● 取下齿轮
● 把黑色壳子上的线剪下(下一个大步会告诉你怎么处理它们)。
● 把挡着连续转动的小塑料片儿剪掉。
3 使伺服电机连续转动之进阶篇
● 现在,电位计已被成功调戏~(≧▽≦)/~,她一直采集连续信号。
● 从黑壳子上剪出红色,绿色和黄色的线(这个应当在上一步就做好了)。
● 绿色的线和黄色线之间焊个2.2k的电阻
● 在红色和黄色的线之间也焊个2.2k的电阻
4 反向设置
● 在相同模拟信号下,伺服机的转向一般是相同的。他们对称安装在小w上,但是要让一个反向怎么办?在硬件和软件上都可以解决(我用硬件做的,因为我是代码懒人,摔!)。
● 剪下电机到电机板子上的红色和蓝色的线。
● 焊接红线到蓝线,然后蓝线到红线(头晕了吧?其实就是像图上那样交叉一下)。
5 组装电机
● 这步很容易嘿!尽可能温柔滴把线塞到伺服机壳子里面,然后把齿轮装配好。可是捏,我加了电阻后,以前的壳子就不合适了,所以我用绝缘胶布把他们缠在一块儿的。
6 齿轮上阵
● 怎么附上去呢?我用的热胶,其实任何粘性强的玩意儿都可以使,先剪两根1英寸长的硬线。
● 把每根线用热胶粘在伺服机顶部的齿轮里面。线要对半,露一半出来!
● 在每根线的末端粘3个磁盘。磁盘也必须是对准中心!
7 伺服机与单片机对接
● 我用pin 9和 pin 10来驱动电机。
● pin 9 -》伺服机1的橙线。
● pin 10 -》伺服机2的橙线
● ground -》伺服机1,2的黑线。
● vcc -》伺服机1,2的红线。
8 接光敏电阻
● 把每个光敏电阻(光传感器)都连到arduino上,一共4个传感器,左、右、前、后。
● 每个光传感器的电路图下面有,传感器的一条线连接到vcc;另一条线连到10k和100欧姆的电阻上。10k电阻接地,100欧姆电阻连接输入端。每个传感器的输入(绿线)连到mini上的模拟端口(a0,a1,a2,a3)。
● 我程序里是这样设置的:analog 0 -》 顶部的传感器;analog 1 -》 左边的传感器;analog 2 -》 前面的传感器;analog 3 -》 右边的传感器。
9 加上rgb led灯
● 把每个光敏电阻(光传感器)都连到arduino上,一共4个传感器,左、右、前、后。
● 你是不是想在每个端口和led灯之间放个电阻(200 欧姆左右)?我没有酱紫,因为我的led灯可以承受的电压比arduino能提供的高得多,所以不会被烧。
10 安装电池● 其实捏,能提供3—4v的电池都可以用,越轻越好。我使用了sparkfun锂电池。接地,然后高压直接接arduino的vcc口。
11 上程序!● 这代码是关于2个伺服电机根据4个光传感器的输入值而进行驱动。根据模式,有几种运动方式。
*/
#include 《servo.h》
// right and left servos
servo servo1;
servo servo2;
// light sensors
int topsensor = 0; //700
int leftsensor = 1; /// threshhold is 400
int frontsensor = 2; //400
int rightsensor = 3; //300
// hardcoded thresholds (not used because we auto-calibrate)
int topthreshhold = 400;
int leftthreshhold = 550;
int frontthreshhold = 200;
int rightthreshhold = 650;
// current robot type (red gree or yellow)
int state = 0;
// state values
int red = 0;
int green = 1;
int orange = 2;
// pins to drive the top tri-color led
int redpin = 5;
int greenpin = 6;
// values to hold sensor readings
int front;
int right;
int left;
int top;
// auto-calibrate light sensor thresholds
void calibrate() {
serial.println(“calibrating”);
long int val = 0;
for (int i = 0; i《5; i++) {
val += analogread(frontsensor);
delay(10);
}
frontthreshhold = (val /5) - 80;
val = 0;
for (int i = 0; i《5; i++) {
val = val + analogread(topsensor);
serial.println(analogread(topsensor));
serial.println(val);
delay(10);
}
topthreshhold = (val /5) -200;
val = 0;
for (int i = 0; i《5; i++) {
val += analogread(rightsensor);
}
rightthreshhold = (val /5) - 100;
val = 0;
for (int i = 0; i《5; i++) {
val += analogread(leftsensor);
}
leftthreshhold = (val /5) - 100;
// print threshold values for debug
serial.print(“top: ”);
serial.println(topthreshhold);
serial.print(“right: ”);
serial.println(rightthreshhold);
serial.print(“left: ”);
serial.println(leftthreshhold);
serial.print(“front: ”);
serial.println(frontthreshhold);
}
void setup()
{
// turn on pin 13 for debug
pinmode(13, output);
digitalwrite(13, high);
// setup sensor pins
for (int i = 0; i《4; i++) {
pinmode(i, input);
}
serial.begin(9600);
calibrate();
// generate a random state
state = random(0, 3);
setcolor(state);
}
// motor functions
void turnleft()
{
serial.println(“left”);
start();
delay(20);
for (int i = 0; i《20; i++) {
servo2.write(179);
servo1.write(1);
delay(20);
}
stop();
delay(20);
}
void turnright() {
serial.println(“right”);
start();
delay(20);
for (int i = 0; i《20; i++) {
servo2.write(1);
servo1.write(179);
delay(20);
}
stop();
delay(20);
}
void goforward(int del = 20) {
serial.println(“forward”);
start();
delay(20);
for (int i = 0; i《20; i++) {
servo1.write(179);
servo2.write(179);
delay(del);
}
stop();
delay(20);
}
void stop() {
servo1.detach();
servo2.detach();
delay(10);
}
void start() {
servo1.attach(10);
servo2.attach(9);
}
// set the color of the top tri-color led based on the current state
void setcolor(int color) {
if (color == red) {
digitalwrite(greenpin, 0);
analogwrite(redpin, 180);
}
else if (color == green) {
digitalwrite(redpin, 0);
analogwrite(greenpin, 180);
}
else if (color == orange) {
analogwrite(redpin, 100);
analogwrite(greenpin, 100);
}
}
// blink the yellow color (when robot is confused)
void blinkorange() {
for (int i = 0; i《5; i++) {
analogwrite(redpin, 100);
analogwrite(greenpin, 100);
delay(300);
digitalwrite(redpin, 0);
digitalwrite(greenpin, 0);
delay(300);
}
analogwrite(redpin, 100);
analogwrite(greenpin, 100);
}
void loop()
{
top = analogread(topsensor);
long int time = millis();
while (analogread(topsensor) 《 topthreshhold) {
delay(10); // while there is an arm wave from the user don‘t do anything
}
if ((millis() - time) 》 3000) {
// if the sensor was covered for more than 3 seconds, re-calibrate
calibrate();
}
// if the top sensor was covered, we change state
if (top 《 topthreshhold) {
state = (state+1) %3;
setcolor(state);
serial.print(“changed state: ”);
serial.println(state);
}
// read the other sensors
right = analogread(rightsensor);
left = analogread(leftsensor);
front = analogread(frontsensor);
if (state == red) {
// go towards objects
if (front 《 frontthreshhold) {
goforward();
} else if (right 《 rightthreshhold) {
turnright();
} else if (left《leftthreshhold) {
turnleft();
} else {
goforward();
}
}
if (state == green) {
// go away from objects
if (front 《 frontthreshhold) {
int dir = random(0,2);
if (dir == 0 && right 》 rightthreshhold) {
turnright();
} else if (dir == 1 && left 》 leftthreshhold) {
turnleft();
}
} else if (right 《 rightthreshhold) {
if (left 》 leftthreshhold) {
turnleft();
} else {
goforward();
}
} else if (left《leftthreshhold) {
if (right 》 rightthreshhold) {
turnright();
} else {
goforward();
}
} else {
goforward();
}
delay(200);
}
if (state == orange) {
// only move if there are no hand motions- otherwise blink
int dir = random(0, 3);
if (left《leftthreshhold || right《rightthreshhold ||
front《leftthreshhold) {
blinkorange();
} else {
if (dir == 0) {
goforward();
} else if (dir == 1) {
turnright();
} else if (dir == 2) {
turnleft();
}
delay(1000);
}
delay(10);
}
}
红色最快,趋向物体(当光传感器检测到光被挡住时);
蓝色是中速,背向物体(背向黑色区域);
黄色最慢,检测到物体就停止。
● 小w和它的兄弟姐妹们通过磁铁轮子在墙上运动,可以左转右转和前行;根据不同模式可进行调速。
● 当顶部的传感器被遮住超过3秒,所有传感器自动校准。
12 别让小w裸奔
● 给小w穿件衣裳。但之前必须确定程序能跑,然后你能分得清哪个伺服机是左,哪个是右。
● 因为小w要垂直运动,衣裳越轻越好啊!我用的硬纸壳,其实报纸或者轻塑料都能使。
● 我把伺服机用热胶黏在硬纸盒里,传感器分布在前后左右,然后用硬纸壳加固。为了让热传感器和齿轮舒舒服服在里面呆着,我量体裁衣剪了些洞。小w的顶部其实就是。。。就是一张纸!
● 然后。。。然后没有然后了,你就做好了,玩儿去吧!

揭秘大功率绕线电感封装尺寸变化对电感参数的影响
特斯拉回应磷酸铁锂版Model3车主称电量无法充满
三星S8评测:高屏占比里面的小秘密,偷偷告诉你
自制空芯电感,Coil
2019华南工业智造展深圳开幕在即!汇聚业界翘楚,解读5G时代
萌版蜘蛛侠:爬墙机器人DIY作品秀
固态硬盘Trim指令是什么有什么作用如何正常工作
网络视频监控系统相关知识科普
你不知道的事:格力收购银隆正在以退为进
户外储能电源能运用到哪些使用场景?
ST活动跟踪/骨传导二合一传感器:TWS/XR耳机的理想选择
详解微站BookRRU的主要特点
蓝牙音箱设计电路图
未来10年OLED是否会取代LED照明?
微雪电子树莓派外扩板 | Raspberry Pi 高精度AD/DA介绍
国家电网分析我国新能源发展路径及变化
基于压控增益放大器VCA822的可编程宽带放大器
iPhone 5上市临近 高通、飞兆半导体等芯片厂商大获益
海速芯TM52F1363单片机在智能电热杯中的应用
钛酸锂电池为何没有成为主流_钛酸锂电池优缺点详解