本帖最后由 国产招财猫 于 2017-10-26 22:42 编辑
参赛项目:
物联网机械臂小车
参赛组员:
1人
国产招财猫
大一电子爱好者,入门Arduino半年
项目简介:
本项目结合乐高积木和Arduino编程,利用乐高积木搭建机械臂,配合Arduino编程,使用户可以通过在手机上或者电脑上远程控制小车的自由移动和机械臂的夹持功能,从而实现远程移动物体的功能。
预计完成时间:
预计10月初
联系方式:
331245059@qq.com
以下为项目更新内容 参赛作品:物联网机械臂小车 原件: Rosbot主控板 KittenBot WiFi模块 车体(带直流减速电机) 少许乐高积木 舵机 2节18650(+电池座)+DC电源插头
功能:
结合乐高积木和KittenBot的主控板和WiFi模块,通过手机端下载官方的KittenbotApp控制小车运动(电脑端需下载模拟器) KittenbotAPP下载地址:http://cdn.kittenbot.cn/KittenbotApp_v1.52.apk
制作:
先利用积木搭建出机械爪形状,靠舵机拉动实现抓取功能
再将整体固定到车体上(只买了舵机,整个乐高的机械爪加舵机有点重,利用舵机带不动,所以就直接粘在车体上了……) (制作成臂状可以通过ServoFunction创建多个Servo,不过要用扭矩更大的来实现关节功能)
整体 (局部插线) 源码: (因Servo库中使用舵机功能与使用的9,10脚的轮子功能有冲突,所以不能使用Servo库) car.ino
[mw_shl_code=bash,true]#include "Motor.h"
#include "ServoFunction.h"
Motor myMotor(5, 6, 9, 10);
ServoFunction myServo(11);
int pos = 40;
int x, y;
bool servoFlag = false, catchFlag = false;
void setup (){
Serial.begin(115200);
Serial.println("Begin");
delay(1000);
}
void loop (){
while (Serial.available()){
if (Serial.read() == 'M'){
int temp = Serial.parseInt();
if (temp == 201){
Serial.findUntil(" ", '\n');
y = Serial.parseInt();
Serial.findUntil(" ", '\n');
x = Serial.parseInt();
while (Serial.read() != '\n');
if (!myMotor.move(y, x))
servoFlag = true;
}
}
}
serialEvent();
}
void serialEvent(){
if (!servoFlag) return;
if (Serial.available()) return;
servoFlag = !servoFlag;
myMotor.stop();
if (catchFlag){
catchFlag = !catchFlag;
for (pos = 40; pos >= 0; pos -= 5) {
myServo.turn(pos);
delay(15);
}
}
else{
catchFlag = !catchFlag;
for (pos = 0; pos <= 40; pos += 5) {
myServo.turn(pos);
delay(15);
}
}
}[/mw_shl_code]
Motor.cpp
[mw_shl_code=cpp,true]#include "Motor.h"
#include <Arduino.h>
Motor::Motor(char pin1, char pin2, char pin3, char pin4):
M1pinF(pin1), M1pinB(pin2), M2pinF(pin3), M2pinB(pin4)
{
motorInit();
}
Motor::~Motor(){
}
void Motor::motorInit(){
pinMode(M1pinF, OUTPUT);
pinMode(M1pinB, OUTPUT);
pinMode(M2pinF, OUTPUT);
pinMode(M2pinB, OUTPUT);
stop();
}
bool Motor::move(char y, char x){
if (y < 30 && y > -30) return false;
int M1pwm, M2pwm;
if (x != 50 && x != -50){
M1pwm = M2pwm = y > 0 ? y + 120 : y - 120;
}
else if (x == 50){
M1pwm = 255;
M2pwm = -255;
}
else{
M1pwm = -255;
M2pwm = 255;
}
motorMove(M1pwm, M2pwm);
return true;
}
void Motor::stop(){
digitalWrite(M1pinF, LOW);
digitalWrite(M1pinB, LOW);
digitalWrite(M2pinF, LOW);
digitalWrite(M2pinB, LOW);
}
void Motor::motorMove(int M1pwm, int M2pwm){
motorFunction(M2pinF, M2pinB, M2pwm);
motorFunction(M1pinF, M1pinB, M1pwm);
}
void Motor::motorFunction(char pinF, char pinB, int pwm){
if (pwm == 0) {
digitalWrite(pinF, LOW);
digitalWrite(pinB, LOW);
return;
}
if (pwm > 0){
analogWrite(pinF, pwm);
digitalWrite(pinB, LOW);
}
else {
analogWrite(pinB, -pwm);
digitalWrite(pinF, LOW);
}
}[/mw_shl_code]
ServoFunction.cpp
[mw_shl_code=bash,true]#include "ServoFunction.h"
#include <Arduino.h>
ServoFunction::ServoFunction(int servoPin) : servoPin(servoPin) {
pinMode(servoPin, OUTPUT);
}
ServoFunction::~ServoFunction(){
}
void ServoFunction::turn(int angle){
for(int i=0;i<50;i++){
int pulsewidth = (angle * 11) + 500;
digitalWrite(servoPin, HIGH);
delayMicroseconds(pulsewidth);
digitalWrite(servoPin, LOW);
delayMicroseconds(20000 - pulsewidth);
}
}
[/mw_shl_code]
演示视频:
视频链接:http://v.youku.com/v_show/id_XMzA2NTIzODkxMg==.html?spm=a2h0k.8191407.0.0&from=s1.8-1-1.2
源码压缩包:
car.rar
(1.8 KB, 下载次数: 30)
|