与Arduino的初次相遇
2020年6月份的时候,那天在b站上看到一位叫“喵咪的哥哥”的up发布了自己制作的声控四驱车旋风冲锋,突然唤起了童年时代的愿望,那时候多想要同类型的产品啊,你的一个手势和信号,一台机器就为你运作了起来,多酷啊~ 那设备怎么识别你的信号呢?其实就是将各种各样的输入信号通过元器件转换为电信号,再由一块“小小的电路板”将处理这些电信号,再输出指令给被控制的。
百度了一下网友推荐最容易上手的就是Arduino和51单片机,那我就来学习下Arduino吧先。把20年夏天的笔记整理一下,我是按照b站up“科技传播坊”这个视频学的,链接如下,用的Arduino UNO R3板,烧录软件为Arduino IDE,这位up主推荐按功能模块学习而不是按原理来学习,比较符合我想要快速造点小玩意出来的需求,基础知识以后需要再补一补吧。
https://www.bilibili.com/video/BV1nx411U7Ht?spm_id_from=333.999.0.0
什么是Arduino?
Arduino是一个能够用来感应和控制现实物理世界的一套工具。 它由一个基于单片机并且开放源码的硬件平台,和一套为Arduino板编写程序 的开发环境组成。不是所有的东西都需要一台微型计算机来处理,这种板子具有很好的性价比。
Arduino的输入与输出类型
主要明白数字(两个数值),模拟(一个范围的数值)和串口
输入输出接口对应的Arduino UNO R3板子位置:
什么是面包板?
实现功能
1. 点亮闪烁LED
void setup() {
// put your setup code here, to run once:
//也就是说这个void setup里的程序只会被执行一次
pinMode(13, OUTPUT);//定义13号为输出模式
}
void loop() {
// put your main code here, to run repeatedly:
//也就是说这个void loop里的程序会被无限循环执行
digitalWrite(13, HIGH);//数字输出,13号高电频
delay 1000;//防止闪烁过快,延时1s,默认单位为毫秒
digitalWrite(13, LOW);//数字输出,13号低电频
delay 1000;//防止闪烁过快,延时1s,默认单位为毫秒
}
2. 跑马灯
void setup() {
// put your setup code here, to run once:
for(int i=6;i<=9;i++){
pinMode(i, OUTPUT);//用循环语句批量定义输出口
}
}
int num =100;//定义常数,作为后面的持续时间
void loop() {
// put your main code here, to run repeatedly:
// 前一个端口低电压,后一个端口高电压,然后持续一段时间来实现跑马灯效果。
digitalWrite(6, LOW);
digitalWrite(7, HIGH);
delay(num);
digitalWrite(7, LOW);
digitalWrite(8, HIGH);
delay(num);
digitalWrite(8, LOW);
digitalWrite(9, HIGH);
delay(num);
digitalWrite(9, LOW);
digitalWrite(6, HIGH);
delay(num);
}
3. 程序控制开关进而控制灯的亮和灭
注意:这个开关,并不像初中物理里那个开关与小灯串联的电脑,开关和小灯是各自独立的两个电路,开发板通过接收和判断开关上的信息再来生成一个信息给输出的小灯。
void setup() {
// put your setup code here, to run once:
pinMode (7, OUTPUT);//定义灯为输出口
pinMode (8, INPUT);//定义开关为输入口
digitalWrite(8, HIGH);//定义默认值高电频,否则程序不知道现在是什么状态
}
void loop() {
// put your main code here, to run repeatedly:
if(digitalRead(8)==HIGH)//按下开关
digitalWrite(7,HIGH);
else
digitalWrite(7,LOW);
}
4. 蜂鸣器钢琴
(这个up主在这即兴演奏了一曲,要笑死我了)
void setup() {
// put your setup code here, to run once:
pinMode(8,INPUT);
digitalWrite(8, HIGH);
pinMode(2,OUTPUT);
pinMode(9,INPUT);
digitalWrite(9, HIGH);
pinMode(3,OUTPUT);
pinMode(10,INPUT);
digitalWrite(10, HIGH);
pinMode(4,OUTPUT);
pinMode(11,INPUT);
digitalWrite(11, HIGH);
pinMode(5,OUTPUT);
}
void loop() {
// put your main code here, to run repeatedly:
if(digitalRead(8)==LOW){
digitalWrite(2, HIGH);
tone(13, 882); //蜂鸣器频率
}
else if(digitalRead(9)==LOW){
digitalWrite(3, HIGH);
tone(13, 1112); //蜂鸣器频率
}
else if(digitalRead(10)==LOW){
digitalWrite(4, HIGH);
tone(13, 1322); //蜂鸣器频率
}
else if(digitalRead(11)==LOW){
digitalWrite(5, HIGH);
tone(13, 1484); //蜂鸣器频率
}
else{
noTone(13);
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
}
}
5. 呼吸灯
重点:Arduino 中带~的口可作为模拟输出 可用用analogWrite模拟输出语句。
void setup() {
// put your setup code here, to run once:
pinMode(11,OUTPUT);
}
void loop() {
// put your main code here, to run repeatedly:
for(int i=0;i<=30;i++){
analogWrite(11,i); //模拟输出语句,可以看到这里设置了30个梯度
delay(50);
}
for(int i=30;i>=0;i--){
analogWrite(11,i); //模拟输出语句
delay(50);
}
}
6. 呼吸跑马灯
重点:用取余去做循环
void setup() {
// put your setup code here, to run once:
pinMode(3,OUTPUT);
pinMode(5,OUTPUT);
pinMode(6,OUTPUT);
pinMode(9,OUTPUT);
pinMode(10,OUTPUT);
pinMode(11,OUTPUT);
}
int level = 0;//写在外面,不要写在loop里面,因为不想让它重置
int ports[]={3,5,6,9,10,11};
int idx = 0;//控制数组
void loop() {
// put your main code here, to run repeatedly:
analogWrite(ports[idx],level);
delay(500);
++level %=10;// ++level; level= level%7;
++idx %=6;//下一循环数组归到0
/*这个意思就是说从数组0,开始,一直到数组5,每次把对应的那个灯亮度打到相应值
* 到数组5了就调idx,让它从0开始,亮度则与数组没有相关性,循环一次就加一次,直到设定值,再变回来
*/
}
7. 台灯
重点:
1.学会模拟输入(这里用的是变阻器)
2.学会调用打印函数
3.学会用串口监视器
4.学会映射,最好学会用map函数
Map(X, a, b, c, d)
void setup() {
// 模拟输入口A0-A5,只能默认输入,所以没有必要定义输入
pinMode(9, OUTPUT);//灯的输入
Serial.begin(9600);//类似于JAVA中的类方法,参数是9600比特率
}
void loop() {
/* 灯是模拟输出的范围是[0,255],而A0模拟输入的范围是[0,1023],
所以要映射一下,让范围变得一样 */
analogWrite(9, analogRead(A0)/4);
Serial.println(analogRead(A0)/4);
}
8. 数码管骰子
class LedSegmentDisplays
{
private:
int ports[8];//定义LED端口
int digits[10][8];//用二维数组定义0-9这个是个数字对应端口的High和LOW
public:
LedSegmentDisplays(int a, int b, int c, int d, int e, int f, int g, int h)//接入端口函数
{
ports[0] = a; ports[1] = b; ports[2] = c; ports[3] = d; ports[4] = e; ports[5] = f; ports[6] = g; ports[7] = h;
int digits_copy[10][8] = {
//每一个数字对应一种LED组合
{1, 1, 1, 1, 1, 1, 0, 0}, // 0
{0, 1, 1, 0, 0, 0, 0, 0}, // 1
{1, 1, 0, 1, 1, 0, 1, 0}, // 2
{1, 1, 1, 1, 0, 0, 1, 0}, // 3
{0, 1, 1, 0, 0, 1, 1, 0}, // 4
{1, 0, 1, 1, 0, 1, 1, 0}, // 5
{1, 0, 1, 1, 1, 1, 1, 0}, // 6
{1, 1, 1, 0, 0, 0, 0, 0}, // 7
{1, 1, 1, 1, 1, 1, 1, 0}, // 8
{1, 1, 1, 1, 0, 1, 1, 0} // 9
};
for(int i = 0; i < 8; i++)
pinMode(ports[i], OUTPUT);//对8个端口数字输入
for(int i = 0; i < 10; i++)
for(int j = 0; j < 10; j++)
digits[i][j] = digits_copy[i][j];//对每个数组进行赋值
}
void noLight()
{
for(int i = 0; i < 8; i++)
digitalWrite(ports[i], LOW);//给端口低电压
}
void d(int digit)
{
for(int i = 0; i < 8; i++)
digitalWrite(ports[i], digits[digit][i]);//给端口高电压
}
};//封装
void setup() {
randomSeed(analogRead(0));//配合下面的random使用,如果希望程序重新启动后产生的随机数值与上一次程序运行时的随机数不同,则需要使用randomSeed()函数。
pinMode(10, INPUT);
digitalWrite(10, HIGH);//开关
}
LedSegmentDisplays Disp(8,9,4,3,2,7,6,5);
void loop() {
if(digitalRead(10) == LOW)
Disp.d(random(1,7)); // Disp中的d功能
delay(20);
}
9. 光敏电阻的使用
记得学会调用串口监视器哈~
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);//设置比特率
pinMode(9, OUTPUT);
}
void loop() {
// put your main code here, to run repeatedly:
analogWrite(9, map(analogRead(0), 40, 70, 0, 255));
Serial.println(analogRead(0));//从A0开始读值
delay(100);
}
10. 拓展
总而言之,感觉需要用到哪个功能就把哪个功能的模块资料拖出来学习就好了,貌似能看懂这些电路图会更牛逼一点。深入的话看来还是得一边做些奇奇怪怪的应用一边补一补基础才行呢。