标签 Arduino 下的文章

本来为了ESP32-C3刷上LVGL,才玩Arduino。但是Arduino确实没MicroPython好玩,而且,我真的需要LVGL吗?这里先记录一下相关操作。

1 刷Arduino固件

使用Arduino IDE操作,最简单。

参考教程:

1.1 设置开发板为ESP32-C3

安装好Arduino IDE(本文所用版本是1.8.19),运行。进入“File” -> “Preferences” -> “Settings”,在“Additional Boards Manager URLs”输入以下网址,并点“OK”。

https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_dev_index.json

要注意,如果本机不能访问以上链接,可在“File” -> “Preferences” -> “Network”设置代理。

然后进入“Tools” -> “Board: xxx” -> “Boards Manager…”。在“Boards Manager”弹出框,搜“esp32”,并选择最高版本,点“Install”。

安装完成后,再次进入“Tools” -> “Board: xxx”,选中“ESP32C3 Dev Module”即可。可以看到“Tools”菜单显示“Board: ESP32C3 Dev Module”,并在下面显示硬件相关信息。

1.2 刷入固件

先在“Tools” -> “Flash Mode”要选“DIO”(这个很重要), 再点“Tools” -> “Burn Bootloader”,等待刷入成功即可。

“Tools”显示的硬件信息参考:

Board: "ESP32C3 Dev Module"
Upload Speed: "921600"
USB CDC on Boot: "Disabled"
CPU Frequency: "160MHz (WiFi)"
Flash Frequency: "80MHz"
Flash Mode: "DIO"
Flash Size: "4MB (32Mb)"
Partition Scheme: "Default 4MB with spiffs (1.2MB APP/1.5MB SPIFFS)"
Core Debug Level: "None"
Erase All Flash before Sketch Upload: "Disabled"
Port: "/dev/ttyACM0"

2 使用I2C OLED屏

这里使用的I2C OLED屏,SSD1315(可用SSD1306的驱动),0.96寸,4针。详细参考如下:

2.1 接线

OLED屏 ESP32-C3
GND<-->25, GND
VCC<-->26, 3.3V
SCL<-->27, GPIO05, I2C_SCL
SDA<-->28, GPIO04, I2C_SDA

2.2 示例代码

以下示例是在屏幕上显示一行文字”Hello, Fox!“。其最麻烦的地方,是找个合适的字体。上传程序前,记得“Tools” -> “Flash Mode”要选“DIO”。

#include <Arduino.h>
#include <U8g2lib.h>

#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif

U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE, /* clock=*/ 5, /* data=*/ 4);

void setup(void) {
  u8g2.begin();
}

void loop(void) {
  u8g2.clearBuffer();         // clear the internal memory
  u8g2.setFont(u8g2_font_chargen_92_mf); // choose a suitable font
  u8g2.drawStr(0,14,"Hello, Fox!");  // write something to the internal memory
  u8g2.sendBuffer();          // transfer internal memory to the display
  delay(1000);  
}

说起来是某天逛珠海这边的电子城(就是二十几家电子元件店铺聚合的地方),经过个一小摊位时,一个自动打招呼的小装置吸引了我(就是那种当有人经过时,播放“欢迎光临”的装置)。店主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的访问权限。