分类 Arduino 下的文章

用Pro Micro做了个摇步器,感觉有点浪费。于是入手了个ATTiny85开发板(国外好像叫Digispark),计划把Pro Micro替换出来。

这个ATTiny85开发板非常迷你和便宜,面积比邮票还小(大约2cm*2.5cm),价格不到7rmb/个。自带Micro USB母口(插上USB就可以烧录程序),除了5v VCC、GND、VIN,还有6个针脚。采用ATTiny85芯片,集成8位CPU,主频最高20MHz,内存512B,闪存8KB等等。更详细的参数,参考以下PDF文档:
https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-2586-AVR-8-bit-Microcontroller-ATtiny25-ATtiny45-ATtiny85_Datasheet.pdf

总体来说这,非常适合细小的项目。但是这货历史有点久远(网上很多资料都是2013年左右),相关资料不好找。踩了一些坑后,终于成功刷入程序并运行。

首先安装 Arduino IDE,版本是1.6以上,然后根据以下文章去配置:
Connecting and Programming Your Digispark
https://digistump.com/wiki/digispark/tutorials/connecting

遇到Linux的问题,主要是需要相关的安装包,可参考这个链接:
Linux Troubleshooting
https://digistump.com/wiki/digispark/tutorials/linuxtroubleshooting

然后,关于编写舵机控制程序,尝试了几个库,最后采用了SoftRcPulseOut并运行成功。参考以下链接:
Beginner Servo
https://digistump.com/board/index.php?topic=1157.0
Digispark (Attiny85) servo tester
http://www.circuitdb.com/?p=1203

最后再说说摇步机。摇步机的原理就是利用舵机进行单摆运动。原来使用手机摇的,现在入手了个二手小米手环2,解放了手机。接线图就不上了,简单描述如下:

ATTiny85 -> 9G舵机(SG90)
5V       -> 红(正极)
GND      -> 棕(负极)
P4       -> 橙(信号)

程序也很简单,舵机先复位到0度,再不断重复从0度转到120度后复位。代码如下:

#include <SoftRcPulseOut.h> 

SoftRcPulseOut myservo;
int pos = 0;
#define NOW  1

void setup() {
  myservo.attach(4); // P4,舵机信号
  myservo.setMaximumPulse(2200);

  for (int i = 0; i < 5; i++) { // 复位到0度
    myservo.write(pos);
    delay(100);
    SoftRcPulseOut::refresh(NOW);
  }
  delay(3000);
  SoftRcPulseOut::refresh(NOW);
} 

void loop() {
  for (pos = 0; pos < 120; pos += 20) {
    myservo.write(pos);
    delay(50);
    SoftRcPulseOut::refresh(NOW);
  }
  
  for (pos = 120; pos >= 0; pos -= 20) {
    myservo.write(pos);
    delay(50);
    SoftRcPulseOut::refresh(NOW);
  }
}

说起来是某天逛珠海这边的电子城(就是二十几家电子元件店铺聚合的地方),经过个一小摊位时,一个自动打招呼的小装置吸引了我(就是那种当有人经过时,播放“欢迎光临”的装置)。店主MM走过来,我仔细研究了一下,问:“光敏电阻?”MM笑了一下,说:“是的,光敏电阻。”顿时明白了这东西的原理——当有人经过时,内置的光敏电阻感应到光的变化(应该是变暗了),然后播放声音。于是想回去后自己也弄一个。

然后到了昨天才想起那件事情,但还是今天晚上才有空做出来。拿出满是灰尘的Arduino盒子,按照网上的电路图接上电路,再写个小程序来读取光敏电阻的数据并作出反应(用个LED闪两下来,代替播放声音的功能)。

电路图如下:
读取光敏电阻(From Arduino台湾使用者社群 http://arduino.tw
http://arduino.tw/allarticlesindex/2009-09-06-18-37-08/50-%E8%AE%80%E5%8F%96%E5%85%89%E6%95%8F%E9%9B%BB%E9%98%BB.html

该控制程序的代码如下:
//---------begin---------------------
int inPin = 2;    //set input pin
int outPin = 13;   //set output pin
int val = 0;   //the current data from LDR (light dependent resistor)
int pre = 0;   //the previous data

void setup() {
//Serial.begin(9600);
pinMode(outPin, OUTPUT);
val = analogRead(inPin);   //read the data from LDR
pre = val;   //init the previous data
}

void loop() {
val = analogRead(inPin);
if(pre - val >= 5) {   //compare the light change, if it turns darker
//Serial.print(pre - val);
//Serial.print("\n");
blinkLED(outPin);
pre = val;
} else if(val - pre >= 5) {  //if it turns brighter
pre = val;
}
}

//make the LED blinks
void blinkLED(int pin){
digitalWrite(pin, HIGH);
delay(200);
digitalWrite(pin, LOW);
delay(200);
digitalWrite(pin, HIGH);
delay(200);
digitalWrite(pin, LOW);
}
//---------end---------------------

int inPin = 2;    //set input pin
int outPin = 13;   //set output pin
int val = 0;
int pre = 0;
void setup() {
//Serial.begin(9600);
pinMode(outPin, OUTPUT);
val = analogRead(inPin);
pre = val;
}
void loop() {
val = analogRead(inPin);
if(pre - val >= 5) {
//Serial.print(pre - val);
//Serial.print("\n");
blinkLED(outPin);
pre = val;
} else if(val - pre >= 5) {
pre = val;
}
}
void blinkLED(int pin){
digitalWrite(pin, HIGH);
delay(200);
digitalWrite(pin, LOW);
delay(200);
digitalWrite(pin, HIGH);
delay(200);
digitalWrite(pin, LOW);
}

总结下吧。对电路方面还是有很多不熟悉的地方,虽然高中物理的电路理论几乎都能用上,但都忘了很多。唉~~更不用说大学时还学过的“大学物理”、“数字电路”、“模拟电路”……对了,该装置可以在很多情况下代替红外线感应的,而且成本上可以节省一大笔(例如开头提到的“欢迎光临”装置)。对于我来说,或者可以用来抓蟑螂。

经过多个晚上的搜索与实践,终于在今天上午把Arduino IDE装到CentOS 5.4上了。其实Arduino IDE是用Java写的,这个可以直接运行。但是是该IDE需要用到avr-gcc进行交叉编译,而且CentOS 5.4上没有rpm包直接安装,所以要自己动手编译。为了研究相关的设置和依赖包,费了很多时间。以下是安装过程的总结。

首先,安装binutils、avr-gcc和arv-libc

参考:
Building your own avr-gcc environment with atmega328p capabilities, Linux
=> http://tuxgraphics.org/electronics/200901/avr-gcc-linux.shtml#0lfindex0
gcc编译安装中的链接错误
=> http://qingyan1971.spaces.live.com/blog/cns!90DC91975FC440F6!502.entry

1)binutils-2.20.1

--Download: http://ftp.gnu.org/gnu/binutils/

执行以下命令:
tar jxvf binutils-2.20.1.tar.bz2
cd binutils-2.20.1
mkdir obj-avr
cd obj-avr
CC=gcc
export CC
../configure --target=avr --prefix=/usr/local/avr --disable-nls --enable-install-libbfd

make

make install

cd ../..

2)gcc-core-4.4.3、gcc-g++-4.4.3

---------------------- 注 意 ----------------------
安装avr-gcc前,先检查是否已经安装了GMP 4.1以上和MPFR 2.3.0以上。
GMP 4.1+
=>CentOS 5.4的安装光盘可以找到GMP 4.1的rpm包,直接安装就可以了。
=>源码地址:http://ftp.gnu.org/gnu/gmp/

MPFR 2.3.0+
=>源码地址:http://www.mpfr.org/=>由于没有rpm包,只能通过源码编译安装。
=>安装完毕,要添加路径到/etc/ld.so.conf文件中。安装完毕后会有提示的。
------------------------------------------------------

--Download: http://ftp.gnu.org/gnu/gcc/gcc-4.4.3/要下载gcc-core-4.4.3和gcc-g++-4.4.3,或者只下载gcc-4.4.3就可以了

执行以下命令:
tar jxvf gcc-core-4.4.3.tar.bz2
tar jxvf gcc-g++-4.4.3.tar.bz2
cd gcc-4.4.3
mkdir obj-avr
cd obj-avr
../configure --target=avr --prefix=/usr/local/avr --disable-nls --enable-languages=c,c++ --disable-libssp --with-mpfr=/usr/local/lib/mpfr

make

make install

cd ../..

3)avr-libc-1.6.4

--Download: http://savannah.nongnu.org/projects/avr-libc/

tar jxvf avr-libc-1.6.4.tar.bz2
cd avr-libc-1.6.4
PREFIX=/usr/local/avr
export PREFIX
CC=avr-gcc
export CC
PATH=/usr/local/avr/bin:${PATH}
export PATH
./configure --build=`./config.guess` --host=avr --prefix=/usr/local/avr

make

make install

cd ..

--------------------------------------------------------------------

然后,安装FTDI USB驱动

--参考:http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1267186646/3#3

After you install the Arduino environment and plug in the board, make sure you can see the /dev/ttyUSBx device.
Code:

安装完Arduino开发环境和把板子插到电脑USB口上,看是否有/dev/ttyUSBx设备。可以执行以下命令查看:
ls -la /dev/ttyU*

如果没有该设备,则用root用户执行以下命令:
modprobe ftdi_sio

别忘了设置该/dev/ttyUSBx的访问权限。

终于下定决心卖个Arduino开发板了。于是前天晚上去“淘宝“逛了一下,以150RMB买了个Mega,加上“面包板“(8RMB)和70条连接线(8RMB),还有两个热敏电阻(0.5RMB/个),一共167RMB。今天东西都到手了!

回宿舍后,马上下个最新版的IDE(版本号0018)。读取出那个最基本的LED闪烁控制程序,编译后上传到开发板,结果正常!由于Mega板载一个可控制的LED,所以不用额外插个LED测试。而且已经有Bootloader,程序上传后即可运行。

Arduino Mega是目前最强大的Arduino开发板了。其芯片采用ATmega 1280-16au,CPU频率为16MHz,8KB SRAM,128KB闪存(其中4KB用于Bootloader),4KB EEPROM,还有54pin I/O接口……详细参数如下:

Microcontroller ATmega1280
Operating Voltage 5V
Input Voltage (recommended) 7-12V
Input Voltage (limits) 6-20V
Digital I/O Pins 54 (of which 14 provide PWM output)
Analog Input Pins 16
DC Current per I/O Pin 40 mA
DC Current for 3.3V Pin 50 mA
Flash Memory 128 KB of which 4 KB used by bootloader
SRAM 8 KB
EEPROM 4 KB
Clock Speed 16 MHz

这么好的东西,用来做个什么好呢?确实是个问题。

忘了是什么时候发现Arduino这个开源项目,接着又研究了一下,然后被深深吸引了。

Arduino是个可编程芯片的开源项目——不仅是软件开源,连电路板的设计也是开源。也可以简单理解为一个便宜的单片机开发平台。据介绍,Arduino的开发者本来就是想开发一个便宜的单片机给他的学生用。(官方网站:www.arduino.cc)现在,Arduino的应用已经很广泛了——二足机器人、遥控摄像车都让人惊叹不已!

大概花了两个星期,把《Getting Started with Arduino》的英文电子版看完。发现这东西非常简单易用——采用C语言编程,可以集成到Eclipse的开发环境,采用USB供电和烧录程序。看那资料时,就想着开发点什么。不过板子还没买回来,估计要等到“五一”才能开始动手去玩了。

PS. 今天故意逛了一下这边的电子城。那感觉就像发现了天堂一样——异常兴奋!虽然东西不够深圳那边丰富,但也足够我玩了。