参考资料

《processing与arduino》互动编程 黄文凯 、吴羽编著
《arduino程序设计基础》陈吕洲编著

电路知识

画电路图的https://fritzing.org/download/

电子元件

面包板
电阻
限流电阻
下拉电阻 将某个节点通过一个很大的电阻接地的方式叫做下拉,为的是在引脚悬空的时候稳定电平。或者可以使用输入mode中的上拉模式(注意此时高低电平的对应改变)。
电容 旁路,去耦,滤波,储能
二极管 整流,稳压
三极管 放大,震荡,开关
继电器 含有一个线圈,通电后发生电磁感应,将开关从一端吸到另一端
电位器(滑动变阻器?
光敏电阻 电阻值随光照强度增加而下降的电阻

传感器

方位
五向倾斜模块
陀螺仪

触摸
电容触摸感应

声音
模拟声音传感器

气味
MQx系列气味传感器

processing

Notes

  • 每个语句后面加;
  • 开头需要声明变量类型
  • 单引号和双引号不能混用,单引号:,双引号:

标准结构

  1. void setup()
  2. {//用于程序的初始化设置,只运行一次。配置串口,I/O接口等
  3. }
  4. void draw()
  5. {//用于添加用户的代码,默认每秒执行60次
  6. }

坐标系及基本图形

画图坐标
左上角为原点,yprocessing和arduino交互笔记 - 图1xprocessing和arduino交互笔记 - 图2
设置
fullScreen()
background()
stroke()/noStroke()
fill()/noFill()
clear()

图形
rect(x, y, width, height)

  1. // Run full screen using the P2D renderer on screen 2
  2. int x = 0;
  3. void setup() {
  4. fullScreen(P2D, 2);//在2号屏幕上使用P2D渲染模式全屏显示
  5. background(0);//背景色
  6. noStroke();//无边框
  7. fill(102);//填充色为灰色
  8. }
  9. void draw() {
  10. rect(x, height*0.2, 1, height*0.6);
  11. x = x + 2;//因为1像素太小了,人眼不可分辨,所以看起来是连续的,实际上下一个矩形的坐标应为x=x+1
  12. }

arduino

Notes

C/C++混合编程

  • 注释使用//,/xxx /添加
  • 每个语句后面加;
  • 开头需要声明变量类型,例如int i = 95;

标准结构

  1. void setup()
  2. {//用于程序的初始化设置,只运行一次
  3. }
  4. void loop()
  5. {//用于添加用户的代码,不断重复运行
  6. }

程序基础

数据类型

整数型int 浮点型float/double 字符型char 布尔型boolean
int i = 95;

数据结构

数组 int a[3] = {1,2,3};

运算符

逻辑运算符
&& 与
||或
!非

选择结构

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
processing和arduino交互笔记 - 图3
https://blog.csdn.net/acktomas/article/details/85197175
processing和arduino交互笔记 - 图4
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
    void 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();     
      }  
    }
    
    示例:arduino输出输入的char
    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上的圆形变成红色,松开开关,变成绿色。初始颜色为绿色、

画面画一个圆形,设置为绿色
读取开关的接通状态
如果开关接通
使用红色重新填充
如果开关断开
使用绿色重新填充