参考资料
《processing与arduino》互动编程 黄文凯 、吴羽编著
《arduino程序设计基础》陈吕洲编著
电路知识
画电路图的https://fritzing.org/download/
电子元件
面包板
电阻
限流电阻
下拉电阻 将某个节点通过一个很大的电阻接地的方式叫做下拉,为的是在引脚悬空的时候稳定电平。或者可以使用输入mode中的上拉模式(注意此时高低电平的对应改变)。
电容 旁路,去耦,滤波,储能
二极管 整流,稳压
三极管 放大,震荡,开关
继电器 含有一个线圈,通电后发生电磁感应,将开关从一端吸到另一端
电位器(滑动变阻器?
光敏电阻 电阻值随光照强度增加而下降的电阻
传感器
方位
五向倾斜模块
陀螺仪
触摸
电容触摸感应
声音
模拟声音传感器
processing
Notes
- 每个语句后面加;
- 开头需要声明变量类型
- 单引号和双引号不能混用,单引号:,双引号:
标准结构
void setup()
{//用于程序的初始化设置,只运行一次。配置串口,I/O接口等
}
void draw()
{//用于添加用户的代码,默认每秒执行60次
}
坐标系及基本图形
画图坐标
左上角为原点,yx
设置
fullScreen()
background()
stroke()/noStroke()
fill()/noFill()
clear()
图形
rect(x, y, width, height)
// Run full screen using the P2D renderer on screen 2
int x = 0;
void setup() {
fullScreen(P2D, 2);//在2号屏幕上使用P2D渲染模式全屏显示
background(0);//背景色
noStroke();//无边框
fill(102);//填充色为灰色
}
void draw() {
rect(x, height*0.2, 1, height*0.6);
x = x + 2;//因为1像素太小了,人眼不可分辨,所以看起来是连续的,实际上下一个矩形的坐标应为x=x+1
}
arduino
Notes
C/C++混合编程
- 注释使用//,/xxx /添加
- 每个语句后面加;
- 开头需要声明变量类型,例如int i = 95;
标准结构
void setup()
{//用于程序的初始化设置,只运行一次
}
void loop()
{//用于添加用户的代码,不断重复运行
}
程序基础
数据类型
整数型int 浮点型float/double 字符型char 布尔型boolean
int i = 95;
数据结构
运算符
选择结构
if(表达式){语句;}else if(表达式){语句;}else(表达式){语句;}
循环结构
当型while
while(表达式){语句;}
直到型until
do{语句;}while(表达式};
for
for(初始化语句;判断语句;增量语句){语句;}
eg. for(i=0; i<5;i++){ }
break退出continue跳过本次循环判断是否开始下一次循环
时间控制函数、延时函数
获取arduino从通电\复位到现在的时间
精度和arduino使用的晶振赫兹有关,4-8us
millis();//ms, max 50 days
micros();//us, max 70 mins
delay();//ms
delayMicroseconds();//us
I/O接口
数字信号
0,1的不连续信号
0低电平0v 1高电平(当前工作电压)
//配置引脚模式
pinMode(pin, mode);//INPUT, OUTPUT, INPUT_PULLUP
//OUTPUT
digitalWrite(pin, value);
//INPUT
digitalRead(pin);
可以在初始化设置的时候配置变量 int led=13;这样可以增加程序可读性,也方便日后更换引脚(只需要改变一处)
模拟信号
连续变化的物理量,arduino中常用0-5v的电压来表示。
通过板子上的模拟引脚,可以将0-5v的模拟信号转换为0-1023的整数(AVR主控芯片支持10位精度)。
输出使用PWM pulse width modulation 脉冲宽度调制的方法(原理大概为调整每个周期内高低电平的比例 占空比)来达到输出模拟值的效果,要想输出真正的模拟值需要加上外围滤波电路。pin为~数字,数值为0-255.
//配置引脚模式
pinMode(pin, mode);//INPUT, OUTPUT, INPUT_PULLUP
//OUTPUT
analogWrite(pin, value);
//INPUT
analogRead(pin);
arduino板介绍
板上组件详细介绍
Arduino UNO R3
https://blog.csdn.net/acktomas/article/details/85197175
15:0-13 数字信号引脚,13号引脚旁边有一个led可以用来测试,高电平/高阻态时点亮
10:A0-A5 模拟信号引脚
14:TX,向计算机传送数据时亮;RX,接收到计算机的数据时点亮。#arduino程序写入中时,两个灯会快速闪烁
5、17:Arduino重置:你可以重置你的Arduino板,例如从一开始就启动你的程序。可以通过两种方式重置UNO板。首先,通过使用板上的复位按钮(17)。其次,你可以将外部复位按钮连接到标有RESET(5)的Arduino引脚。
Memory
Flash 32kb(0.5kb BOOT区)
SRAM 3kb 内存,断电或复位后数据丢失
EEPROM 1kb 用户可更改的只读储存器,断电或复位后数据不丢失
入门:连接电脑
file:///C:/Program%20Files%20(x86)/Arduino/reference/www.arduino.cc/en/Guide/Windows.html
- 1 |获取Arduino开发板和USB电缆
- 2 |下载Arduino软件(IDE)
- 3 |连接板
- 4 |安装驱动程序
- 5 |启动Arduino应用程序
- 6 |打开眨眼的例子
- 7 |选择你的板子
- 8 |选择你的串口
- 9 |上载程序
两者间通信
串行接口:采用串行通信方式的扩展接口processing的串口编程
通过serial库
示例:processing向串口发送数据import processing.serial.*; Serial port; //实例化一个serial对象 String message; void setup(){ message = "c"; port = new Serial(this,"COM3",9600);//第2个参数端口号,第3个参数比特率(通信的速率)。除以8可以得到每秒传输的字节数。 } void draw(){ port.write(message); }
arduino的串口编程
?通过在头文件HardwareSerial.h中定义一个HardwareSerial类的对象serial,然后直接使用类的成员函数。?默认还是需要自己设置A:默认的
reference:file:///C:/Program%20Files%20(x86)/Arduino/reference/www.arduino.cc/en/Reference/Serial.html
示例:arduino输出输入的charvoid setup(){ Serial.begin(9600); //Serial.begin(speed)通信双方使用一致的比特率,串口监视器中的比特率也要设置成一致的 } void loop(){ //OUTPUT Serial.print(val); //输出 Serial.printIn(val); //输出并换行 //INPUT Serial.read()//每次返回1字节的数据,int -1对应的字符是一乱码。当缓冲区没有数据的时候就会输出 //INPUT//输出前先判断缓冲区中是否有数据,有了再输出 if(Serial.available()){ c = Serial.read(); } }
int c = 0; void setup(){ Serial.begin(9600); } void loop(){ if(Serial.available()){ c = Serial.read(); Serial.print("the char i have received:"); Serial.println(c,DEC); //输出并换行 } delay(200); }
两者间通信
reference: 《Processing与Arduino互动编程》黄文恺、吴羽processing-> arduino
实现在processing界面画一个矩形,当用鼠标单击矩形内时,arduino引脚13上的LED亮并在processing中输出“亮”,单击矩形外时LED灭。
画面画一个矩形
读取鼠标点击的位置
如果在矩形内
arduino引脚13上的LED亮
processing中输出亮
如果在矩形外
arduino引脚13上的LED灭
processing中输出灭
processing
import processing.serial.*;
Serial port; //实例化一个serial对象
void setup(){
port = new Serial(this,"COM3",9600);//第2个参数端口号,第3个参数比特率(通信的速率)。除以8可以得到每秒传输的字节数。
size(300,300);
}
void draw(){
rect(100,100,50,50);
}
void mouseClicked(){
if((mouseX>=100)&(mouseX<=150)&(mouseY>=100)&(mouseY<=150))
{ println("LED turns ON!");
port.write("a");//接收到电脑传来的信息,RX灯亮
}
else
{ println("LED turns OFF!");
port.write("b");
}
}
arduino
int c = 0;
void setup(){
Serial.begin(9600);
pinMode(13,OUTPUT); //set pin13 into output mode
digitalWrite(13,LOW); // set initial Electrical Level of pin13 into low
}
void loop(){
if(Serial.available()){
c = Serial.read();
if(c==97) //注意读取的是ascii编码
digitalWrite(13,HIGH);//RX亮完之后13LED亮
else
if(c==98) #注意读取的是ascii编码
digitalWrite(13,LOW);
}
}
arduino-> processing
长按开关,processing上的圆形变成红色,松开开关,变成绿色。初始颜色为绿色、
画面画一个圆形,设置为绿色
读取开关的接通状态
如果开关接通
使用红色重新填充
如果开关断开
使用绿色重新填充