如何使用探索者其他扩展板
作者:机器谱
Birdmen 舵机扩展板 步进扩展板 |
1. 简介
探索者Birdmen手柄扩展板可以堆叠连接到任何兼容Arduino标准接口的控制板或扩展板上,供用户快速制作游戏手柄、无线遥控器、机器人控制器等设备。Birdmen与Bigfish配合使用还能快速实现示教编程,帮助没有任何编程基础的用户快速制作简易的智能机器人。
2. 特点
· 完全兼容Arduino 接口
· 摇杆X\Y轴输出为两个电位器,可以通过AD转换读出扭动角度
· 两路独立按键,数字输出,方便使用
· 板上标注有各个模块的端口配置,方便调试
· 预留了其他没有占用的端口,方便后期扩展
· 通过该扩展板可以制作一个遥控手柄,结合无线模块可实现无线控制
· 结合Arduino DUE还可以模拟电脑鼠标等
· 带示教编程固件
3. 参数
· 两个PS2游戏摇杆(A0/A1、A2/A3)
· 两个独立按键(D2、D3)
· 兼容BIGFISH扩展板的扩展接口
· 1个IIC接口、1个TTL串口
· 8个LED指示灯(D4~D11)
实物图片与接口
5. 熟悉birdmen上各个交互器件的基础编程
器材:Birdmen手柄扩展板、Basra控制板、miniUSB数据线。
硬件连接:将Birdmen扩展板堆叠连接到Basra控制板上,将Basra控制板通过miniUSB数据线连接到电脑上。
①读取Pad0纵向摇杆(A0引脚)数值,并在Serial Monitor中显示出来。图形化程序如下:
②读取Button0按键的值(D2引脚),并在Serial Monitor中显示出来。代码如下:
③点亮连接到D4针脚的Led灯
④按下Button0时,才点亮D4针脚的Led灯
void setup() { Serial.begin(9600); } void loop() { Serial.print(analogRead(A0)); Serial.println(); } |
void setup() { pinMode( 2, INPUT); Serial.begin(9600); } void loop() { Serial.print(digitalRead(2)); Serial.println(); } |
void setup() { pinMode( 4 , OUTPUT); } void loop() { digitalWrite( 4 , LOW ); } |
void setup() { pinMode( 2, INPUT); pinMode( 4 , OUTPUT); } void loop() { if (!( digitalRead(2) )) { digitalWrite( 4 , LOW ); } else { digitalWrite( 4 , HIGH ); } } |
#include <Wire.h> #include <pasta.h> #include <Arduino.h> #include <Servo.h> #include <EEPROM.h> #include <SignalFilter.h> #include "LedControl.h" #include <MsTimer2.h> int mychannel=0; int ledPort[2] = {7,8}; //定义灯的引脚 int sensorPort[2] = {A0,A4}; Button button[2]; Joypad joypad[2]; Servo myServo; Bmotor myMotor[2]; LedControl lc=LedControl(12,11,13,1); //config 8*8 led bool isAutomode; bool isRecording; bool isPlaying; bool isTrigger[2]; int valueServo; int valueMotor[2]; #define DELTATIME 10 #define ACTTIMESCALE 20 #define RECORDLED 10 #define PLAYLED 10 #define MAXLENGTH 150 #define ADD_CHANNEL 1001 int time; int currentLength; int actLength; int valueAct[MAXLENGTH][3]; void setup() { Wire.begin(); Serial.begin(9600); MsTimer2::set(DELTATIME, Timer); isAutomode = true; isRecording = false; isPlaying = false; button[0].initial(2); button[1].initial(3); joypad[0].initial(A0,A1); joypad[0].setDiscreteness(100); //直流电机仅3种状态 joypad[1].initial(A2,A3); joypad[1].setDiscreteness(10); //舵机分20级 for(int i=0;i<2;i++){ pinMode(ledPort[i], OUTPUT); digitalWrite(ledPort[i], HIGH); pinMode(sensorPort[i], INPUT_PULLUP); } LedInit(); myServo.attach(4); myMotor[0].initial(9,10); myMotor[1].initial(5,6); } void loop() { for(int i=0;i<2;i++){ button[i].polling(); if(button[i].isUp) startControlMode(i); } if(isAutomode){ for(int i=0;i<2;i++){ isTrigger[i] = !digitalRead(sensorPort[i]); LedDot(0, i, isTrigger[i]); if(isTrigger[i]){ if(isPlaying){ if(i != mychannel){ mychannel = i; stopPlaying(); startPlaying(); } } else{ mychannel = i; startPlaying(); } } } } else{ freeControl(); if(isRecording) recording(); } if(isPlaying) playing(); } void Timer(){ time++; } void LedInit() { lc.shutdown(0,false); //start the 8*8 led lc.setIntensity(0,8); LedClear(); } void LedClear() { lc.clearDisplay(0); } void LedDot(int x, int y, boolean s) { if(x<0)x=0; if(x>7)x=7; if(y<0)y=0; if(y>7)y=7; lc.setLed(0,x,y,s); } void recordDetect(){ if(isPlaying){ stopPlaying(); } else{ isRecording = !isRecording; if(isRecording){ startRecording(); } else{ stopRecording(); } } } void startRecording(){ time = 0; currentLength = 0; MsTimer2::start(); } void stopRecording(){ MsTimer2::stop(); isRecording = false; showChannel(mychannel,true); actLength = currentLength; saveData(); } void startPlaying(){ isPlaying = true; time = 0; currentLength = 0; loadData(); MsTimer2::start(); } void stopPlaying(){ MsTimer2::stop(); isPlaying = false; } void recording(){ static bool isFlash; if(time % RECORDLED == 0) isFlash = !isFlash; showChannel(mychannel,isFlash); if((time / ACTTIMESCALE) > currentLength){ valueAct[currentLength][0] = valueMotor[0]; valueAct[currentLength][1] = valueMotor[1]; valueAct[currentLength][2] = valueServo; currentLength++; if(currentLength >= MAXLENGTH) stopRecording(); } } void playing(){ static bool isFlash; if(time % PLAYLED == 0) isFlash = !isFlash; showChannel(mychannel,isFlash); if((time / ACTTIMESCALE) > currentLength){ myMotor[0].run(valueAct[currentLength][0]); myMotor[1].run(valueAct[currentLength][1]); myServo.write(valueAct[currentLength][2]); currentLength++; if(currentLength >= actLength) stopPlaying(); } } void freeControl(){ for(int i=0;i<2;i++) joypad[i].polling(); valueServo = (int)map(joypad[1].x,-100,100,10,160); valueMotor[0] = (int)map(joypad[0].x,-100,100,-1,1); valueMotor[1] = (int)map(joypad[0].y,-100,100,-1,1); if(joypad[1].isChangeX) myServo.write(valueServo); if(joypad[0].isChangeX) myMotor[0].run(valueMotor[0]); if(joypad[0].isChangeY) myMotor[1].run(valueMotor[1]); if(joypad[1].y == -100) isTrigger[0] = true; else isTrigger[0] = false; if(joypad[1].y == 100) isTrigger[1] = true; else isTrigger[1] = false; for(int i=0; i<2; i++){ if(isTrigger[i] && !isRecording){ if(isPlaying){ if(i != mychannel){ mychannel = i; stopPlaying(); startPlaying(); } } else{ mychannel = i; startPlaying(); } } } } void showChannel(int channel, bool s){ if(channel == 0){ digitalWrite(ledPort[0], HIGH); digitalWrite(ledPort[1], !s); } if(channel == 1){ digitalWrite(ledPort[1], HIGH); digitalWrite(ledPort[0], !s); } } void saveData(){ EEPROM.write(ADD_CHANNEL + mychannel, actLength); for(int i=0; i<actLength; i++) for(int j=0; j<3; j++) EEPROM.write(i * 3 + j + mychannel * MAXLENGTH * 3, valueAct[i][j] + 1); } void loadData(){ actLength = EEPROM.read(ADD_CHANNEL + mychannel); for(int i=0; i<actLength; i++) for(int j=0; j<3; j++) valueAct[i][j] = EEPROM.read(i * 3 + j + mychannel * MAXLENGTH * 3) - 1; } void startControlMode(int channel){ if(isAutomode){ mychannel = channel; showChannel(channel,true); isAutomode = false; stopPlaying(); } else{ if(mychannel == channel){ recordDetect(); } else{ mychannel = channel; isRecording = false; isPlaying = false; showChannel(channel,true); } } } |
6. 实现示教编程
器材:Birdmen手柄扩展板、Bigfish扩展板、Basra控制板、连接线、miniUSB数据线、锂电池、舵机1、直流电机2个、触碰传感器2个。
硬件连接:将Bigfish扩展板堆叠连接到Basra控制板上,将Birdmen手柄扩展板堆叠连接到Bigfish扩展板上。
其他硬件连接及Birdmen按键功能如下图所示:
下载固件Teaching.ino到Basra主控板,源代码如下:
操作过程:
1、将Birdmen手柄扩展板、Bigfish扩展板和Basra控制板堆叠连接好;
2、将舵机和电机连好,先不要连接传感器;
3、打开电源开关;
4、此时处于“自主模式”,操作电机0/1和舵机0的摇杆,没有反应;
5、按一下录制0/1按键,Led0/1灯会亮起,表示进入“示教模式”;
6、在示教模式下,操作电机0/1和舵机0的摇杆,电机和舵机会相应转动;
7、如果第5步按下的是录制0按键,那么再按一下录制0按键,Led0会开始闪动,表示进入录制状态;如果第5步按下的是录制1按键,那么再按 一下录制0按键,Led1会熄灭,Led0会亮起,此时又按一下录制0按键,Led0会开始闪动,表示进入录制状态;
8、在录制状态下,操作电机或舵机,操作过程会被记录下来;
9、完成录制操作后,按一下录制0按键,结束录制。如果录制时间超过30秒,则会自动结束录制;
10、将播放摇杆拨动到播放0的位置,将开始自动执行刚才录制的动作;
11、关闭主控板电源,拔下Birdmen扩展板,将传感器0安装到Bigfish扩展板的相应端口上。重新打开电源,此时处于自主模式,传感器0若触发,将自动播放前面录制0的动作。
7. 无线遥控器
利用Birdmen和NRF模块可以制作无线遥控手柄,详情请见:通识-【U011】如何使用探索者通信模块-NRF模块
8. 原理图
9. 资料清单
序号 | 内容 |
1 | Birdmen示教编程固件 |
【整体打包】-【U012】如何使用探索者的其他扩展板-Birdmen-资料附件.zip | 2.96KB | 下载14次 | 下载 |
1. 简介
Arduino是开源的控制板,非常适合爱好电子制作的朋友制作互动作品,但对于一些不熟悉电子技术的爱好者,要在Arduino控制板上添加电路是一个比较麻烦是事,所以我们设计了一个专用于简单机器人的扩展板,能将更多的舵机轻松地和Arduino控制板连接。
SH-SR舵机扩展板共有28个舵机接口和2个直流电机接口。此扩展板采取TLC5940串行转并行芯片,可以把5个IO,转化为16个PWM接口。并且此芯片可以采取级联的形式,进一步扩展IO数量。对于IO资源有限的CPU进行扩展很有帮助。
2. 特点
· 兼容Arduino控制板标准接口;
· 全部铜制插针,用料考究,电器性能稳定;
· 优秀PCB设计,美观大方;
· 多种特殊接口设计,兼容部分探索者电子模块,使用方便;
· 所有接口采用清晰丝印标注引脚设计,尽可能的避免电子模块间连线造成的误操作;
· 板载舵机接口、直流电机驱动芯片、可直接驱动舵机、直流电机等机器人常规执行部件,无需外围电路;
· 采用两种供电方式,DC插头或者接线端子;
· 采用分别供电方式,使电路电压更加稳定。
3. 参数
· 板载两片直流电机驱动芯片L9170,支持3v~15v的vin电压,可驱动两个直流电机。
· 采用两个TLC5940芯片,可以同时驱动28路 舵机以及2路直流电机
· 预留TX、RX、5V、GND四个引脚方便扩展
· IR的HEXFET功率场效应管irf3205采用先进的工艺技术制造,具有极低的导通阻抗。irf3205这种特性,加上快速的转换速率,和以坚固耐用著称的HEXFET设计,使得irf3205成为极其高效可靠、应用范围超广的器件。IRF3205是MOS场效应管,它在逆变器里的作用是当做开关管的。逆变器是一种将直流电(DC)转化为交流电(AC)的装置。它由逆变桥、控制逻辑和滤波电路组成。
· 电机部分采用4个8550 PNP型三极管起到电流放大作用
4. 注意事项
(1)SH-SR舵机扩展板需要与Basra/Arduino堆叠使用,并且要分别供电,当有一个断电后,扩展板板都会失去作用。
(2)SH-SR舵机扩展板供电需要8V以下电源,并且电流不得超过6A。否则三极管极易烧毁。
(3)此扩展板占用了Basra/Arduino UNO的3、9、10、11、12共5个接口。
5. 实物图片与接口
6. 与控制板堆叠连接
7. 控制直流电机。
器材:Basra/Arduino UNO控制板、SH-SR扩展板、直流电机、舵机、4芯输入排线、miniUSB下载线、锂电池等。
先将函数库Tlc5940复制到Arduino软件目录下libraries文件夹内。
编写并上传以下代码,这个例程的内容是控制连接在28、29端口的直流电机实现一个正反转的效果,这个原理和控制电机调速完全一样。
#include "Tlc5940.h" void setup() { Tlc.init(0); //引脚初始化 } void loop() {
Tlc.set(28, 4000); //设置PWM输出,范围 0 ~ 4095 Tlc.set(29, 0); Tlc.update(); //设置引脚PWM后使用update()更新设置 delay(2000); Tlc.set(28, 0); Tlc.set(29, 4000); Tlc.update(); delay(2000); } |
#include "Tlc5940.h" //库头文件,该文档同目录下文件,使用时放置在Arduino软件目录下libraries文件夹内 #include "tlc_servos.h"//库头文件,该文档同目录下文件,使用时放置在Arduino软件目录下libraries文件夹内 void setup() { Tlc.init(0); //引脚初始化 tlc_initServos(); //设置PWM频率为50HZ } void loop() { tlc_setServo(0, 45); //舵机角度设置(0~27的端口号,转动角度) Tlc.update(); //PWM或者舵机角度设置后使用update()更新设置 delay(500); tlc_setServo(0, 90); Tlc.update(); delay(500); } |
8. 控制舵机
将一个舵机连接到SH-SR扩展板的0号舵机接口上,注意舵机连接线的黑线与GND端口相连。
编写并上传以下代码。
9. 资料清单
序号 | 内容 |
1 | Tlc5940函数库 |
2 | 舵机控制上位机软件(C#) |
【整体打包】-【U012】如何使用探索者的其他扩展板-舵机扩展板-资料附件.zip | 67.12MB | 下载14次 | 下载 |
1. 简介
探索者SH-ST步进电机扩展板采用A4988步进电机驱动芯片,该扩展板可用作雕刻机,3D打印机等设备的步进电机驱动扩展板。SH-ST一共有4路步进电机驱动模块插槽,可驱动4路步进电机,而每一路步进电机都只需要2个IO口,也就是说,6个IO口就可以很好的管理3个步进电机,使用起来非常方便,告别传统步进电机的繁琐操作。
Arduino UNO主控板(探索者Basra主控板)与模块IO口对应关系介绍,步进电机的基本控制需要的引脚,其它引脚是在驱动雕刻机或3D打印机的时候才用到的,这里不做详解,IO对应如下:
Arduino UNO/Basra接口 | SH-ST扩展板接口 |
D8 | EN(步进电机驱动使能端,低电平有效) |
D13 | A.DIR(A的方向控制) |
D7 | Z.DIR(Z轴的方向控制) |
D6 | Y.DIR(Y轴的方向控制) |
D5 | X.DIR(X轴的方向控制) |
D12 | A.STEP(A的步进控制) |
D4 | Z.STEP(Z轴的步进控制) |
D3 | Y.STEP(Y轴的步进控制) |
D2 | X.STEP(X轴的步进控制) |
M0 | M1 | M2 | 微步解析 |
L | L | L | 全步进 |
H | L | L | 1/2步进 |
L | H | L | 1/4步进 |
H | H | L | 1/8步进 |
H | H | H | 1/16步进 |
2. 特点
· 完全兼容Arduino控制板标准接口
· 全部铜制插针,用料考究,电器性能稳定
· 优秀PCB设计,美观大方
· 多种特殊接口设计,兼容部分探索者电子模块,使用方便
· 多种供电模式:主控板供电或者扩展板供电(DC插头供电),方便使用
· 所有接口采用清晰丝印标注引脚设计,尽可能的避免电子模块间连线造成的误操作
· 可同时驱动四路步进电机(亦可通过TX,RX串口级联其他扩展板)驱动更多步进电机
· 电源开关设置,可以直接控制通断电(从扩展板供电)
3. 参数
· 12的输入电压,扩展板和控制板共用一个电源即可
· 预留TX、RX、5V、GND、3.3V、SCL、SDA、RST等引脚方便扩展
· 有五种细分模式分别是:全步进、1/2步进、1/4步进、1/8步进、1/16步进
· A4988模块上可调电位器可以调节最大电流输出,从而获得更高的步进率
· 模块上自动电流衰减模式检测\选择
· 接地短路保护和加载短路保护
4. 细分设置
4.1关于三个模式选择端 M0,M1,M2我们全部接地也就是全步进模式(转一圈要200个步进值或者一步进1.8°),如果要求精度更高,我们可以通过选择其他的模式,比如我们选择1/4步进模式,那么我们电机转一圈就要送800个微步才能完成。
4.2模式选择与M0, M1 ,M2之间的关系:(对应细分跳线帽对应位置如图5.1所示,L表示去掉跳线帽,H表示插上跳线帽)
5. 实物图片与接口
SH-ST扩展板实物图
步进电机驱动芯片A4988模块引脚图
(图中最下面十字螺丝类似的是电位器,使用时需保证电位器十字尽量如图所示不偏移)
扩展板去掉芯片之后的示意图
(每个细分部分由三个跳线帽组成)
扩展板与basra堆叠示意图
(芯片接插时要注意电位器的方向!!!电位器朝向与DC电源接口一致。)
6. 控制4路步进电机
器材:SH-ST步进电机扩展板×1,Basra控制板×1,11.1V动力电池×1,电源报警器×1,步进电机×4,步进电机连接线×4,USB数据线×1;
电路连接:将步进电机扩展堆叠到basra主控板上,注意步进电机个芯片贴好散热片,将11.1V动力电池通过电源导线接到SH-ST扩展板DC电源头位置,注意SH-ST电源开关关闭。将4个步进电机插接到SH-ST扩展板上(步进电机线为排线,插反不会烧毁,只会反转,这点和直流电机类似)。
分别编写并烧录以下两段程序,一个使用了函数库,一个未使用函数库,效果都是实现4个步进电机的方向控制和转动圈数控制。
未使用函数库的写法,代码如下(manto_test.ino):
//下面是简单的步进电机控制程序, #define EN 8 //步进电机使能端,低电平有效 #define X_DIR 5 //X轴 步进电机方向控制 #define Y_DIR 6 //y轴 步进电机方向控制 #define Z_DIR 7 //z轴 步进电机方向控制 #define A_DIR 13 //a轴 步进电机方向控制 #define X_STP 2 //x轴 步进控制 #define Y_STP 3 //y轴 步进控制 #define Z_STP 4 //z轴 步进控制 #define A_STP 12 //a轴 步进控制 /* //函数:step 功能:控制步进电机方向,步数。 //参数:dir 方向控制, dirPin对应步进电机的DIR引脚,stepperPin 对应步进电机的step引脚, steps 步进的步数 //无返回值 */ void step(boolean dir, byte dirPin, byte stepperPin, int steps) { digitalWrite(dirPin, dir); delay(50); for (int i = 0; i < steps; i++) { digitalWrite(stepperPin, HIGH); delayMicroseconds(800); //调试步进电机速度函数 digitalWrite(stepperPin, LOW); delayMicroseconds(800); //调试步进电机速度函数 } } void setup(){//将步进电机用到的IO管脚设置成输出 pinMode(X_DIR, OUTPUT); pinMode(X_STP, OUTPUT); pinMode(Y_DIR, OUTPUT); pinMode(Y_STP, OUTPUT); pinMode(Z_DIR, OUTPUT); pinMode(Z_STP, OUTPUT); pinMode(A_DIR, OUTPUT); pinMode(A_STP, OUTPUT); pinMode(EN, OUTPUT); digitalWrite(EN, LOW); } void loop(){ step(false, X_DIR, X_STP, 200); //X轴电机 反转1圈,200步为一圈 step(false, Y_DIR, Y_STP, 200); //y轴电机 反转1圈,200步为一圈 step(false, Z_DIR, Z_STP, 200); //z轴电机 反转1圈,200步为一圈 step(false, A_DIR, A_STP, 200); //a轴电机 反转1圈,200步为一圈 delay(1000); step(true, X_DIR, X_STP, 200); //X轴电机 正转1圈,200步为一圈 step(true, Y_DIR, Y_STP, 200); //y轴电机 正转1圈,200步为一圈 step(true, Z_DIR, Z_STP, 200); //z轴电机 正转1圈,200步为一圈 step(false, A_DIR, A_STP, 200); //a轴电机 反转1圈,200步为一圈 delay(1000); } |
/* 多步进电机控制例程 * 程序使用 Arduino1.8.2 编写,编译错误请使用较新版本 * 步进电机方向引脚: * dir: x: 5, y: 6, z: 7, a: 13 * 步进电机步进引脚: * stp: x: 2, y: 3, z: 4, a: 12 * 步进电机使能引脚(低电平有效): * en: 8 * 步进电机细分设置:0, 2, 4, 8, 16 * 各细分对应步进电机每周步数: * 0 --> 200 * 2 --> 400 * 4 --> 800 * 8 --> 1600 * 16 --> 3200 */ #include <AccelStepper.h> #include <MultiStepper.h> //注意AccelStepper和MultiStepper的库文件需要安装,放到arduino软件目录下libraries文件夹内 #define EN 8 //步进电机速度,值越大速度越快 #define SPEED_X 1000 #define SPEED_Y 1000 #define SPEED_Z 1000 #define SPEED_A 1000 //步进电机转动步数,每周步数根据细分调整,现在设置的是X全步进(无细分),Y轴8细分,Z轴8细分,A轴16细分 #define STEPS_X 200 #define STEPS_Y 1600 #define STEPS_Z 1600 #define STEPS_A 3200 void stepperSet(); //步进电机速度设置函数 void stepperMove(); //步进电机步进函数 AccelStepper stepper_x(1, 2, 5); // X AccelStepper stepper_y(1, 3, 6); // Y AccelStepper stepper_z(1, 4, 7); // Z AccelStepper stepper_a(1, 12, 13); // A MultiStepper steppers; void setup() { Serial.begin(9600); pinMode(EN, OUTPUT); digitalWrite(EN, LOW); stepperSet(SPEED_X, SPEED_Y, SPEED_Z, SPEED_A); delay(1000); } void loop() { stepperMove(-STEPS_X, -STEPS_Y, -STEPS_Z, -STEPS_A); delay(200); stepperMove(STEPS_X, STEPS_Y, STEPS_Z, STEPS_A); delay(200); } void stepperSet(long v_x, long v_y, long v_z, long v_a){ stepper_x.setMaxSpeed(v_x); stepper_x.setAcceleration(400.0); stepper_y.setMaxSpeed(v_y); stepper_y.setAcceleration(400.0); stepper_z.setMaxSpeed(v_z); stepper_z.setAcceleration(400.0); stepper_a.setMaxSpeed(v_a); stepper_a.setAcceleration(400.0); steppers.addStepper(stepper_x); steppers.addStepper(stepper_y); steppers.addStepper(stepper_z); steppers.addStepper(stepper_a); } void stepperMove(long _x, long _y, long _z, long _a){ long positions[4]; positions[0] = _x; positions[1] = _y; positions[2] = _z; positions[3] = _a; steppers.moveTo(positions); steppers.runSpeedToPosition();
stepper_x.setCurrentPosition(0); stepper_y.setCurrentPosition(0); stepper_z.setCurrentPosition(0); stepper_a.setCurrentPosition(0); } |
使用AccelStepper函数库的写法,代码如下(MultipleStepper_test.ino):
7. 资料清单
序号 | 内容 |
1 | AccelStepper函数库 |
2 | SH-ST步进扩展板PCB电路图 |
3 | 步进电机控制例程(不使用函数库) |
4 | 步进电机控制例程(使用函数库) |
【整体打包】-【U012】如何使用探索者的其他扩展板-步进扩展板-资料附件.zip | 911.41KB | 下载4次 | 下载 |
|