文档库 最新最全的文档下载
当前位置:文档库 › arduino基本函数

arduino基本函数

arduino基本函数
arduino基本函数

3.1.1 pinMode(pin, mode)

3.1 数字I/O

3.1.1 pinMode(pin, mode)

pinMode函数在第2章中已经出现过了,用以配置引脚为输出或输出模式,它是一个无返回值函数,函数有两个参数pin和mode,pin参数表示所要配置的引脚,mode参数表示设置的模式—INPUT(输入)或OUTPUT(输出)。

注意:Arduino板上的模拟引脚也可以当做数字引脚使用,编号为14(对应模拟引脚0)到19(对应模拟引脚5)。

由于Arduino项目是完全开源的,所以pinMode(pin, mode)函数原型可直接在Arduino开发环境目录下的hardware\arduino\cores\arduino文件夹里的wiring_digital.c文件中查看。

函数原型有助于我们深入了解Ardnino的基本函数的底层实现方式,但这部分的内容需要在单独深入学习AVR单片机的基础上进行,本书将这些函数原型从文件中提取出来,有兴趣的读者可以参考一下。一般只要能够熟练地使用这些Arduino基本函数就可以了,本书对函数原型没有进行过多讲解。

pinMode(pin, mode)函数原型:

void pinMode(uint8_t pin, uint8_t mode)

{

uint8_t bit = digitalPinToBitMask(pin);

uint8_t port = digitalPinToPort(pin);

volatile uint8_t *reg;

if (port == NOT_A_PIN)

return;

reg = portModeRegister(port);

if (mode == INPUT)

{

uint8_t oldSREG = SREG;

cli();

*reg &= ~bit;

SREG = oldSREG;

}

else

{

uint8_t oldSREG = SREG;

cli();

*reg |= bit;

SREG = oldSREG;

}

}

可以在开发环境中的下列实例程序中找到pinMode函数的应用:

ADXL3xx.pde、AnalogInput.pde、Blink.pde、BlinkWithoutDelay.pde、Button.pde、Calibration.pde、Debounce.pde、Dimmer.pde、Knock.pde、Loop.pde、Melody.pde、Memsic2125.pde、PhysicalPixel.pde、Ping.pde

3.1.2 digitalWrite(pin,value)

digitalWrite函数也是在Blink程序中见到过的,它的作用是设置引脚的输出的电压为高电平或低电平。该函数也是一个无返回值的函数,函数有两个参数pin和value,pin参数表示所要设置的引脚,value参数表示输出的电压—HIGH(高电平)或LOW(低电平)。

注意:在使用digitalWrite(pin, value)函数设置引脚之前,需要将引脚设置为OUTPUT模式。digitalWrite(pin, value)函数原型同样也可以在wiring_digital.c文件中找到,函数原型如下:void digitalWrite(uint8_t pin, uint8_t val)

{

uint8_t timer = digitalPinToTimer(pin);

uint8_t bit = digitalPinToBitMask(pin);

uint8_t port = digitalPinToPort(pin);

volatile uint8_t *out;

if (port == NOT_A_PIN) return;

// If the pin that support PWM output, we need to turn it off

// before doing a digital write.

if (timer != NOT_ON_TIMER) turnOffPWM(timer);

out = portOutputRegister(port);

if (val == LOW)

{

uint8_t oldSREG = SREG;

cli();

*out &= ~bit;

SREG = oldSREG;

}

else

{

uint8_t oldSREG = SREG;

cli();

*out |= bit;

SREG = oldSREG;

}

}

可以在开发环境的下列实例程序中找到digitalWrite函数的应用:

ADXL3xx.pde、AnalogInput.pde、Blink.pde、BlinkWithoutDelay.pde、Button.pde、Calibration.pde、Debounce.pde、Knock.pde、Loop.pde、Melody.pde、PhysicalPixel.pde、Ping.pde

3.1.3 digitalRead(pin)

digitalRead函数用在引脚为输入的情况下,可以获取引脚的电压情况—HIGH(高电平)或LOW (低电平),参数pin表示所要获取电压值的引脚,该函数返回值为int型,表示引脚的电压情况。函数原型如下:

int digitalRead(uint8_t pin)

{

uint8_t timer = digitalPinToTimer(pin);

uint8_t bit = digitalPinToBitMask(pin);

uint8_t port = digitalPinToPort(pin);

if (port == NOT_A_PIN) return LOW;

// If the pin that support PWM output, we need to turn it off

// before getting a digital reading.

if (timer != NOT_ON_TIMER) turnOffPWM(timer);

if (*portInputRegister(port) & bit) return HIGH;

return LOW;

}

注意:如果引脚没有链接到任何地方,那么将随机返回HIGH或LOW。

可以在开发环境的下列实例程序中找到digitalRead函数的应用:

Button.pde、Debounce.pde

3.2.1 analogReference(type)

3.2 模拟I/O

3.2.1 analogReference(type)

analogReference函数的作用是配置模拟引脚的参考电压。在嵌入式应用中引脚获取模拟电压

值之后,将根据参考电压将模拟值转换到0~1023。该函数为无返回值函数,参数为type 类型,有3种类型(DEFAULT/INTERNAL/EXTERNAL),具体含义如下:

DEFAULT:默认值,参考电压为5V。

INTERNAL:低电压模式,使用片内基准电压源。

EXTERNAL:扩展模式,通过AREF引脚获取参考电压,AREF引脚位置见图3.2。

注意:如果在AREF引脚加载外部参考电压,需要使用一个5KW的上拉电阻,这会避免由于设置不当造成控制芯片的损坏。

3.2.2 analogRead(pin)

analogRead函数用于读取引脚的模拟量电压值,每读一次需要花100ms的时间。参数pin 表示所要获取模拟量电压值的引脚,该函数返回值为int型,表示引脚的模拟量电压值,范围在0~1023。函数原型可在wiring_analog.c文件中查看,如下:

int analogRead(uint8_t pin)

{

uint8_t low, high;

// set the analog reference (high two bits of ADMUX) and select

// the channel (low 4 bits). this also sets ADLAR (left-adjust

// result) to 0 (the default).

ADMUX = (analog_reference << 6) | (pin & 0x07);

// start the conversion

sbi(ADCSRA, ADSC);

// ADSC is cleared when the conversion finishes

while (bit_is_set(ADCSRA, ADSC));

// we have to read ADCL first; doing so locks both ADCL

// and ADCH until ADCH is read. reading ADCL second would

// cause the results of each conversion to be discarded,

// as ADCL and ADCH would be locked when it completed.

low = ADCL;

high = ADCH;

// combine the two bytes

return (high << 8) | low;

}

注意:函数的参数pin范围是0~5,表示6个模拟量I/O口中的一个。

可以在开发环境中的下列实例程序中找到analogRead函数的应用:

ADXL3xx.pde、AnalogInput.pde、Calibration.pde、Graph.pde、Knock.pde、Smoothing.pde、VirtualColorMixer.pde

3.2.3 analogWrite(pin, value) analogWrite函数通过PWM的方式在引脚上输出一个模拟量,较多的应用在LED亮度控制、电机转速控制等方面。

PWM(Pulse Width Modulation,脉冲宽度调制)方式是通过对一系列脉冲的宽度进行调制,来等效地获得所需要的波形或电压。脉冲宽度调制是一种模拟控制方式,其根据相应载荷的变化调制晶体管栅极或基极的偏置,来实现开关稳压电源输出晶体管或晶体管导通时间的改变,这种方式能使电源的输出电压在工作条件变化时保持恒定,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。图3.3是一个简单的PWM波示意图。

其中,VCC是高电平值,T是PWM波的周期,D是高电平的宽度,D/T是PWM波的占空比,当上述PWM波通过一个低通滤波器后,波形中高频的部分被滤掉得到所需的波形,其平均电压为VCC×D/T。因此,可通过调节D的大小来改变占空比,产生不同的平均电压;同样,调节PWM波的周期T也可以改变占空比,从而得到不同的平均电压值。

在Arduino中执行该操作后,应该等待一定时间后才能对该引脚进行下一次操作。Arduino 中的PWM的频率大约为490Hz。该函数支持以下引脚:3、5、6、9、10、11。在Arduino 控制板上引脚号旁边标注~的就是可用作PWM的引脚,如图3.4所示。

analogWrite函数为无返回值函数,有两个参数pin和value,参数pin表示所要设置的引脚,只能选择函数支持的引脚;参数value表示PWM输出的占空比,范围在0~255的区间,对应的占空比为0%~100%,函数原型如下:

void analogWrite(uint8_t pin, int val)

{

if (digitalPinToTimer(pin) == TIMER1A)

{

// connect pwm to pin on timer 1, channel A

sbi(TCCR1A, COM1A1);

// set pwm duty

OCR1A = val;

}

else if (digitalPinToTimer(pin) == TIMER1B)

{

// connect pwm to pin on timer 1, channel B

sbi(TCCR1A, COM1B1);

// set pwm duty

OCR1B = val;

}

else if (digitalPinToTimer(pin) == TIMER0A)

{

if (val == 0)

{

digitalWrite(pin, LOW);

}

else

{

// connect pwm to pin on timer 0, channel A

sbi(TCCR0A, COM0A1);

// set pwm duty

OCR0A = val;

}

}

else if (digitalPinToTimer(pin) == TIMER0B)

{

if (val == 0)

{

digitalWrite(pin, LOW);

}

else

{

// connect pwm to pin on timer 0, channel B

sbi(TCCR0A, COM0B1);

// set pwm duty

OCR0B = val;

}

}

else if (digitalPinToTimer(pin) == TIMER2A)

{

// connect pwm to pin on timer 2, channel A

sbi(TCCR2A, COM2A1);

// set pwm duty

OCR2A = val;

}

else if (digitalPinToTimer(pin) == TIMER2B)

{

// connect pwm to pin on timer 2, channel B

sbi(TCCR2A, COM2B1);

// set pwm duty

OCR2B = val;

}

else if (val < 128)

digitalWrite(pin, LOW);

else

digitalWrite(pin, HIGH);

}

可以在开发环境的下列实例程序中找到analogWrite函数的应用:

Calibration.pde、Dimmer.pde、Fading.pde

3.3.1 shiftOut(dataPin,clockPin,bitOrder,val)

3.3 高级I/O

3.3.1 shiftOut(dataPin,clockPin,bitOrder,val)

shiftOut函数能够将数据通过串行的方式在引脚上输出,相当于一般意义上的同步串行通信,这是控制器与控制器、控制器与传感器之间常用的一种通信方式。

shiftOut函数无返回值,有4个参数:dataPin、clockPin、bitOrder、val,具体说明如下:dataPin:数据输出引脚,数据的每一位将逐次输出。引脚模式需要设置成输出。clockPin:时钟输出引脚,为数据输出提供时钟,引脚模式需要设置成输出。

bitOrder:数据位移顺序选择位,该参数为byte类型,有两种类型可选择,分别是高位先入MSBFIRST和低位先入LSBFIRST。

val:所要输出的数据值。

函数原型在wiring_shift.c文件中,如下:

void shiftOut(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, uint8_t val)

{

uint8_t i;

for (i = 0; i < 8; i++)

{

if (bitOrder == LSBFIRST)

digitalWrite(dataPin, !!(val & (1 << i)));

else

digitalWrite(dataPin, !!(val & (1 << (7 - i))));

digitalWrite(clockPin, HIGH);

digitalWrite(clockPin, LOW);

}

}

另外还有shiftIn函数用于通过串行的方式从引脚上读入数据,其函数定义如下:

uint8_t shiftIn(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder)

{

uint8_t value = 0;

uint8_t i;

for (i = 0; i < 8; ++i)

{

digitalWrite(clockPin, HIGH);

if (bitOrder == LSBFIRST)

value |= digitalRead(dataPin) << i;

else

value |= digitalRead(dataPin) << (7 - i);

digitalWrite(clockPin, LOW);

}

return value;

}

3.3.2 pulseIn(pin,state,timeout)

pulseIn函数用于读取引脚脉冲的时间长度,脉冲可以是HIGH或LOW。如果是HIGH,函数将先等引脚变为高电平,然后开始计时,一直到变为低电平为止。返回脉冲持续的时间长短,

单位为ms。如果超时还没有读到的话, 将返回0。

pulseIn函数返回值类型为无符号长整型(unsigned long),3个参数分别表示脉冲输入的引脚、脉冲响应的状态(高脉冲或低脉冲)和超时时间。函数原型在wiring_pulse.c中,如下:unsigned long pulseIn(uint8_t pin, uint8_t state, unsigned long timeout)

{

uint8_t bit = digitalPinToBitMask(pin);

uint8_t port = digitalPinToPort(pin);

uint8_t stateMask = (state ? bit : 0);

unsigned long width = 0;

// keep initialization out of time critical area

unsigned long numloops = 0;

unsigned long maxloops = microsecondsToClockCycles(timeout) / 16;

// wait for any previous pulse to end

while ((*portInputRegister(port) & bit) == stateMask)

if (numloops++ == maxloops)

return 0;

// wait for the pulse to start

while ((*portInputRegister(port) & bit) != stateMask)

if (numloops++ == maxloops)

return 0;

// wait for the pulse to stop

while ((*portInputRegister(port) & bit) == stateMask)

width++;

return clockCyclesToMicroseconds(width * 10 + 16);

}

可以在开发环境的下列实例程序中找到pulseIn函数的应用:

Memsic2125.pde、Ping.pde

3.4.1 millis( )

3.4 时间函数

3.4.1 millis( )

应用millis函数可获取机器运行的时间长度,单位ms。系统最长的记录时间为9小时22分,如果超出时间将从0开始。函数返回值为unsigned long型,无参数。函数原型如下:unsigned long millis()

{

unsigned long m;

uint8_t oldSREG = SREG;

cli();

m = timer0_millis;

SREG = oldSREG;

return m;

}

注意:函数返回值为unsigned long型,如果用int型保存时间将得到错误结果。

可以在开发环境的下列实例程序中找到millis函数的应用:

BlinkWithoutDelay.pde、Calibration.pde、Debounce.pde

3.4.2 delay(ms)

3.4.2 delay(ms)

delay函数是一个延时函数,在Blink程序中用到过,参数表示延时时长,单位是ms。函数无返回值,原型如下:

void delay(unsigned long ms)

{

uint16_t start = (uint16_t)micros();

while (ms > 0)

{

if (((uint16_t)micros() - start) >= 1000)

{

ms--;

start += 1000;

}

}

}

可以在开发环境的下列实例程序中找到delay函数的应用:

ADXL3xx.pde、AnalogInput.pde、Blink.pde、Fading.pde、Graph.pde、Knock.pde、Loop.pde、Melody.pde、Memsic2125.pde、Ping.pde

3.4.3 delayMicroseconds(us) delayMicroseconds函数同样是延时函数,所不同的是其参数单位是ms(1ms=1000ms)。函数原型如下:

void delayMicroseconds(unsigned int us)

{

// for a one-microsecond delay, simply return.

//the overhead of the function call yields a delay of

//approximately 1 1/8 us.

if (--us == 0)

return;

// the following loop takes a quarter of a microsecond (4 cycles)

// per iteration, so execute it four times for each

//microsecond of delay requested.

us <<= 2;

// account for the time taken in the preceeding commands.

us -= 2;

// busy wait

__asm__ __volatile__ (

"1: sbiw %0,1" "\n\t" // 2 cycles

"brne 1b" : "=w" (us) : "0" (us) // 2 cycles

);

}

可以在开发环境中的下列实例程序中找到delayMicroseconds函数的应用:

Melody.pde、Ping.pde

3.8.2 attachInterrupt(interrupt,function,mode) attachInterrupt函数用于设置外部中断,函数有3个参数:interrupt、function和mode,分别表示中断源、中断处理函数、触发模式。参数中断源可选值0或1,在Arduino中一般对应2号和3号数字引脚;参数中断处理函数用来指定中断的处理函数,参数值为函数的指针,触发模式有4种类型:LOW(低电平触发)、CHANGE(变化时触发)、RISING(低电平变为高电平触发)、FALLING(高电平变为低电平触发)。

下面的例子是通过外部引脚触发中断函数。然后控制13号引脚的LED的闪烁。

int pin = 13;

volatile int state = LOW;

void setup()

{

pinMode(pin, OUTPUT);

attachInterrupt(0, blink, CHANGE); //中断源:1

//中断处理函数:blink()

//触发模式:CHANGE(变化时触发)

}

void loop()

{

digitalWrite(pin, state);

}

//中断处理函数

void blink()

{

state = !state;

}

在使用attachInterrupt函数时要注意以下几点:

在中断函数中delay函数不能使用。

使用millis函数始终返回进入中断前的值。

读取串口数据的话,可能会丢失。

中断函数中使用的变量需要定义为volatile型。

attachInterrupt函数的函数原型可在文件WInterrupts.c中找到,如下所示:

void attachInterrupt(uint8_t interruptNum, void (*userFunc)(void), int mode)

{

if(interruptNum < EXTERNAL_NUM_INTERRUPTS)

{

intFunc[interruptNum] = userFunc;

switch (interruptNum)

{

case 0:

EICRA = (EICRA & ~((1 << ISC00)

|(1 << ISC01)))|(mode << ISC00);

EIMSK |= (1 << INT0);

break;

case 1:

EICRA = (EICRA & ~((1 << ISC10)

|(1 << ISC11)))|(mode << ISC10);

EIMSK |= (1 << INT1);

break;

}

}

}

另外,还有detachInterrupt函数用于取消中断,参数interrupt表示所要取消的中断源,函数的定义如下:

void detachInterrupt(uint8_t interruptNum)

{

if(interruptNum < EXTERNAL_NUM_INTERRUPTS)

{

switch (interruptNum)

{

case 0:

EIMSK &= ~(1 << INT0);

break;

case 1:

EIMSK &= ~(1 << INT1);

break;

}

intFunc[interruptNum] = 0;

}

}

3.9 串口通信

Arduino中串口通信是通过HardwareSerial类来实现的,在头文件HardwareSerial.h中定义了一个HardwareSerial类的对象Serial,直接使用类的成员函数就可简单地实现串口通信。对象和类的概念与应用可参阅 6.1节内容。下面以一个串口调光器的程序为例介绍HardwareSerial类几个较常用的公有成员函数,程序清单如下:

/*

Dimmer(调光器)

通过计算机发送数据控制LED灯的亮度,单字节数据发送,数据范围0~255

使用具有pwm功能的9号引脚

created 2006

by David A. Mellis

modified 14 Apr 2009

by Tom Igoe and Scott Fitzgerald

This example code is in the public domain.

https://www.wendangku.net/doc/b511524678.html,/en/Tutorial/Dimmer

*/

const int ledPin = 9; // the pin that the LED is attached to

void setup()

{

// 设置串口波特率:

Serial.begin(9600); //1

// 设置LED控制引脚:

pinMode(ledPin, OUTPUT);

}

void loop()

{

byte brightness;

// 查询串口是否收到数据:

if (Serial.available()) //2

{

// 获取数据

brightness = Serial.read(); //3

//控制LED亮度

analogWrite(ledPin, brightness);

}

}

串口通信相关语句分析解释。

1. Serial.begin(9600);

该语句的功能是设置串口通信波特率为9600bps,其函数原型如下:

void HardwareSerial::begin(long baud)

{

uint16_t baud_setting;

bool use_u2x;

// U2X mode is needed for baud rates higher than (CPU Hz / 16)

if (baud > F_CPU / 16)

{

use_u2x = true;

}

else

{

// figure out if U2X mode would allow for a better connection

// calculate the percent difference between the baud-rate specified and

// the real baud rate for both U2X and non-U2X mode

uint8_t nonu2x_baud_error = abs((int)(255-

((F_CPU/(16*(((F_CPU/8/baud-1)/2)+1))*255)/baud)));

uint8_t u2x_baud_error = abs((int)(255-

((F_CPU/(8*(((F_CPU/4/baud-1)/2)+1))*255)/baud)));

// prefer non-U2X mode because it handles clock skew better

use_u2x = (nonu2x_baud_error > u2x_baud_error);

}

if (use_u2x)

{

*_ucsra = 1 << _u2x;

baud_setting = (F_CPU / 4 / baud - 1) / 2;

}

else

{

*_ucsra = 0;

baud_setting = (F_CPU / 8 / baud - 1) / 2;

}

// assign the baud_setting, a.k.a. ubbr (USART Baud Rate Register)

*_ubrrh = baud_setting >> 8;

*_ubrrl = baud_setting;

sbi(*_ucsrb, _rxen);

sbi(*_ucsrb, _txen);

sbi(*_ucsrb, _rxcie);

}

2. if (Serial.available())

该语句用来判断Arduino串口是否收到数据,函数Serial.available( )返回值为int型,不带参数。函数原型如下:

int HardwareSerial::available(void)

{

return (RX_BUFFER_SIZE + _rx_buffer->head - _rx_buffer->tail) % RX_BUFFER_SIZE;

}

3. brightness = Serial.read();

该语句的功能是将串口数据读入到变量brightness中,函数Serial.read( )也不带参数,返回值为串口数据,int型。函数原型如下:

int HardwareSerial::read(void)

{

// if the head isn't ahead of the tail, we don't have any characters

if (_rx_buffer->head == _rx_buffer->tail)

{

return -1;

}

else

{

unsigned char c = _rx_buffer->buffer[_rx_buffer->tail];

_rx_buffer->tail=(_rx_buffer->tail + 1) % RX_BUFFER_SIZE;

return c;

}

}

3.10.1 SPI接口概述

3.10 SPI接口

3.10.1 SPI接口概述

SPI(Serial Peripheral Interface)是由摩托罗拉公司提出的一种同步串行外设接口总线,它可以使MCU与各种外围设备以串行方式进行通信以及交换信息,总线采用3根或4根数据线进行数据传输,常用的是4根线,即两条控制线(芯片选择CS和时钟SCLK)以及两条数据信号线SDI和SDO。

SPI是一种高速、全双工、同步的通信总线。在摩托罗拉公司的SPI技术规范中,数据信号线SDI称为MISO(Master-In-Slave-Out,主入从出),数据信号线SDO称为MOSI (Master-Out-Slave-In,主出从入),控制信号线CS称为SS(Slave-Select,从属选择),将SCLK 称为SCK(Serial-Clock,串行时钟)。在SPI通信中,数据是同步进行发送和接收的。数据传输的时钟基于来自主处理器产生的时钟脉冲,摩托罗拉公司没有定义任何通用的SPI时钟规范。

3.10.2 SPI接口数据传输

SPI是以主从方式工作的,其允许一个主设备和多个从设备进行通信,主设备通过不同的SS 信号线选择不同的从设备进行通信。其典型应用示意图如图3.5所示。

当主设备选中某一个从设备后,MISO和MOSI用于串行数据的接收和发送,SCK提供串行通信时钟,上升沿发送,下降沿接收。在实际应用中,未选中的从设备的MOSI信号线需处于高阻状态,否则会影响主设备与选中从设备间的正常通信。

3.10.3 SPI类及其成员函数

Arduino中的SPI通信是通过SPIClass类来实现的,使用SPIClass类能够方便地将Arduino作为主设备与其他从设备通信。SPIClass类提供了6个成员函数供使用者调用,如下:

q begin()

q setBitOrder ()

q setClockDivider ()

q setDataMode ()

q transfer ()

q end ()

begin函数用于初始化SPI总线,函数原型如下:

void SPIClass::begin()

{

// Set direction register for SCK and MOSI pin.

// MISO pin automatically overrides to INPUT.

// When the SS pin is set as OUTPUT, it can be used as

// a general purpose output port (it doesn't influence

// SPI operations).

pinMode(SCK, OUTPUT);

pinMode(MOSI, OUTPUT);

pinMode(SS, OUTPUT);

digitalWrite(SCK, LOW);

digitalWrite(MOSI, LOW);

digitalWrite(SS, HIGH);

// Warning: if the SS pin ever becomes a LOW INPUT then SPI

// automatically switches to Slave, so the data direction of

// the SS pin MUST be kept as OUTPUT.

SPCR |= _BV(MSTR);

SPCR |= _BV(SPE);

setBitOrder的作用是在设置串行数据传输时是先传输低位还是先传输高位,函数有一个type 类型的参数bitOrder,有LSBFIRST(最低位在前)和MSBFIRST(最高位在前)两种类型可选。函数无返回值,原型如下:

void SPIClass::setBitOrder(uint8_t bitOrder)

{

if(bitOrder == LSBFIRST)

{

SPCR |= _BV(DORD);

}

else

{

SPCR &= ~(_BV(DORD));

}

}

setClockDivider 函数的作用是设置SPI串行通信的时钟,通信时钟是由系统时钟分频而得到,分频值可选2、4、8、16、32、64及128,有一个type类型的参数rate,有7种类型,对应7个分频值分别为SPI_CLOCK_DIV2、SPI_CLOCK_DIV4、SPI_CLOCK_DIV8、SPI_CLOCK_DIV16、SPI_CLOCK_DIV32、SPI_CLOCK_DIV64和SPI_CLOCK_DIV128。函数默认参数设置是

SPI_CLOCK_DIV4,设置SPI串行通信时钟为系统时钟的1/4。函数原型如下:

void SPIClass::setClockDivider(uint8_t rate)

{

SPCR = (SPCR & ~SPI_CLOCK_MASK) | (rate & SPI_CLOCK_MASK);

SPSR = (SPSR & ~SPI_2XCLOCK_MASK) | (rate & SPI_2XCLOCK_MASK);

}

setDataMode函数的作用是设置SPI数据模式,由于在SPI通信中没有定义任何通用的时钟规范,所以在具体应用中有的在上升沿采样,有的在下降沿采样,由此SPI存在4种数据模式,如表3.1所示。

表3.1 SPI通信数据模式

模式说明

模式0 上升沿采样下降沿置位SCK闲置时为0

模式1 上升沿置位下降沿采样

模式2 下降沿采样上升沿置位SCK闲置时为1

模式3 下降沿置位上升沿采样

setDataMode函数的type类型的参数mode有4种类型可选,分别是SPI_MODE0、SPI_MODE1、SPI_MODE2和SPI_MODE3。函数原型如下:

void SPIClass::setDataMode(uint8_t mode)

{

SPCR = (SPCR & ~SPI_MODE_MASK) | mode;

}

transfer函数用来传输一个数据,由于SPI是一种全双工、同步的通信总线。所以传输一个数据实际上会发送一个数据,同时接收一个数据。函数的参数为发送的数据值,返回的参数为接收的数据值。函数原型如下:

byte SPIClass::transfer(byte _data)

{

SPDR = _data;

while (!(SPSR & _BV(SPIF)));

return SPDR;

}

end函数停止SPI总线的使用,函数原型如下:

void SPIClass::end()

{

SPCR &= ~_BV(SPE);

}

Arduino控制器的I2C/TWI通讯

在众多通讯接口中,我们已经用过了无线数传,RS485等等。今天我们就来玩玩I2C通讯。

什么的I2C呢?I2C即Inter-Integrated Circuit串行总线的缩写,是PHILIPS 公司推出的芯片间串行传输总线。它以1根串行数据线(SDA)和1根串行时钟线(SCL)实现了双工的同步数据传输。具有接口线少,控制方式简化,器件封

装形式小,通信速率较高等优点。在主从通信中,可以有多个I2C总线器件同时接到I2C总线上,通过地址来识别通信对象。

幸运的是,Arduino已经为我们提供了I2C的库函数(Wire.h),这样我们就可以很轻松的玩I2C通讯了。

这里使用Arduino Diecimila做主机,2个 Arduino Nano做从机(不一定非要nano做从机,Arduino Diecimila、Mini甚至其他I2C器件都可以。如果I2C

总线上挂了多个从机,那么就要在总线上加上拉电阻。),Arduino Nano是Arduino 家族中的新成员,估计大家还不太熟悉吧,这里我就简单介绍一下。

Arduino Nano实际和Arduino Diecimila差不多,但Arduino Nano与Arduino Diecimila相比较,Arduino Nano在体积上占很大优势(PS:体积小,电路板排版超困难~_~!),并且模拟口比Arduino Diecimila多2个,还具有USB电源和外接电源自动切换功能,12版的编译环境就支持nano硬件。

I2C总线也是主从方式通讯,I2C总线允许连接多个微控制器,显然不能同时存在两个主器件,先控制总线的器件成为主器件,这就是总线竞争。在竞争过程中数据不会被破坏、丢失。数据只能在主、从器件中传送,结束后,主、从器件将释放总线,退出主、从器件角色。

下面我们就做个简单的I2C通讯实验,先分别将Arduino主从机的SDA(模拟口4)并接在一起、SCL(模拟口5)并接在一起,+5V并接在一起,GND并接在一起,再通过编译环境的串口监视器向主机发送指令,主机收到后,再通过I2C总线发送给地址匹配的从机,然后从机驱动LED点亮。代码分主从部分,主机部分写入Arduino Diecimila,从机部分写入Arduino Nano。

在上代码之前,我们先了解一下I2C的库函数Wire.h里面的常用函数。

begin() //初始化Wire库,和设置I2C总线主从机

begin(address) //带地址参数就是从机,不带就是主机

requestFrom(address, count) //在启动I2C总线后,可以继续访问另一个地址,和访问次数

beginTransmission(address) //开始给从机发送地址

endTransmission() //结束本次I2C通讯,与上条函数成对使用

send() //发送数据

byte available() //用于判断数据是否有效,有效才开始接收

byte receive() //接收数据

onReceive(handler) //从机接收主机发来的数据,

onRequest(handler) //主机请求从机发送数据

主机代码:(从编译器串口监视器发送数字1,2,3,4来控制从机的LED亮与灭)

#i nclude

void setup()

{

Wire.begin(); // join i2c bus (address optional for master)

Serial.begin(9600);

Serial.println("Ready");

}

void loop()

{

int val;

if(Serial.available() > 0)

{

val=Serial.read();

if(val==49)//1

{

Wire.beginTransmission(4); // 从机地址#4

Wire.send(1); // sends int

Wire.endTransmission(); // stop transmitting

Serial.println("49 OK");

delay(10); //:P

}

else if(val==50)//2

{

Wire.beginTransmission(4); // 从机地址#4

Wire.send(0); // sends int

Wire.endTransmission(); // stop transmitting

Serial.println("50 OK");

delay(10); //:P

}

else if(val==51)//3

{

Wire.beginTransmission(5); // 从机地址#5

Wire.send(1); // sends int

Wire.endTransmission(); // stop transmitting

Serial.println("51 OK");

delay(10); //:P

}

else if(val==52)//4

{

Wire.beginTransmission(5); // 从机地址#5

Wire.send(0); // sends int

Wire.endTransmission(); // stop transmitting

Serial.println("52 OK");

delay(10); //:P

}

else Serial.println(val);

}

}

从机A代码:(接收到主机发送的1点亮LED,接收到0关掉LED)

#i nclude

int LED = 2;

void setup()

{

Wire.begin(4); // 设置从机地址为#4

Wire.onReceive(receiveEvent); //

pinMode(LED,OUTPUT);

}

void loop()

{

delay(100);

}

// that executes whenever data is received from master

// this is registered as an event, see setup()

void receiveEvent(int howMany)

{

int c = Wire.receive(); // receive byte as a character

if(c==1)

{

digitalWrite(LED,HIGH);

}

else if(c==0)

{

digitalWrite(LED,LOW);

}

}

从机B代码:(接收到主机发送的1点亮LED,接收到0关掉LED)

#i nclude

int LED = 2;

void setup()

{

Wire.begin(5); // 设置从机地址为#5

Wire.onReceive(receiveEvent); //

pinMode(LED,OUTPUT);

}

void loop()

{

delay(100);

}

// that executes whenever data is received from master

// this is registered as an event, see setup()

void receiveEvent(int howMany)

{

int c = Wire.receive(); // receive byte as a character

if(c==1)

{

digitalWrite(LED,HIGH);

}

else if(c==0)

{

digitalWrite(LED,LOW);

}

}

Arduino 语法手册函数部分

Arduino 语法手册函数部分 摘自:函数部分 数字 I/O pinMode() 描述 将指定的引脚配置成输出或输入。详情请见digital pins。 语法 pinMode(pin, mode) 参数 pin:要设置模式的引脚 mode:INPUT或OUTPUT 返回 无 例子 ledPin = 13 语法 noTone(pin) 参数 pin: 所要停止产生声音的引脚 返回 无 shiftOut() shiftOut() 描述 将一个数据的一个字节一位一位的移出。从最高有效位(最左边)或最低有效位(最右边)开始。依次向数据脚写入每一位,之后时钟脚被拉高或拉低,指示刚才的数据有效。 注意:如果你所连接的设备时钟类型为上升沿,你要确定在调用shiftOut()前时钟脚为低电平,如调用digitalWrite(clockPin, LOW)。 注意:这是一个软件实现;Arduino提供了一个硬件实现的SPI库,它速度更快但只在特定脚有效。 语法 shiftOut(dataPin, clockPin, bitOrder, value) 参数 dataPin:输出每一位数据的引脚(int)

clockPin:时钟脚,当dataPin有值时此引脚电平变化(int) bitOrder:输出位的顺序,最高位优先或最低位优先 value: 要移位输出的数据(byte) 返回 无 shiftIn() 描述 将一个数据的一个字节一位一位的移入。从最高有效位(最左边)或最低有效位(最右边)开始。对于每个位,先拉高时钟电平,再从数据传输线中读取一位,再将时钟线拉低。 注意:这是一个软件实现;Arduino提供了一个硬件实现的SPI库,它速度更快但只在特定脚有效。 语法 shiftIn(dataPin,clockPin,bitOrder) 参数 dataPin:输出每一位数据的引脚(int) clockPin:时钟脚,当dataPin有值时此引脚电平变化(int) bitOrder:输出位的顺序,最高位优先或最低位优先 返回 读取的值(byte) pulseIn() 描述 读取一个引脚的脉冲(HIGH或LOW)。例如,如果value是HIGH,pulseIn()会等待引脚变为HIGH,开始计时,再等待引脚变为LOW并停止计时。返回脉冲的长度,单位微秒。如果在指定的时间内无脉冲函数返回。 此函数的计时功能由经验决定,长时间的脉冲计时可能会出错。计时范围从10微秒至3分钟。(1秒=1000毫秒=1000000微秒) 语法 pulseIn(pin, value) pulseIn(pin, value, timeout) 参数 pin:你要进行脉冲计时的引脚号(int)。 value:要读取的脉冲类型,HIGH或LOW(int)。 timeout (可选):指定脉冲计数的等待时间,单位为微秒,默认值是1秒(unsigned long)返回 脉冲长度(微秒),如果等待超时返回0(unsigned long) 例子 int pin = 7; unsigned long duration;

ARDUINO入门及其简单实验7例

ARDUINO入门及其简单实验(7例) (1) 1. Arduino硬件开发平台简介 (1) 1.1 Arduino的主要特色 (2) 1.2 Arduino的硬件接口功能描述 (3) 1.3 Arduino的技术性能参数 (3) 1.4 电路原理图 (4) 2. Arduino软件开发平台简介 (5) 2.1 菜单栏 (5) 2.2 工具栏 (6) 2.3 Arduino 语言简介 (6) 3. Arduino开发实例中所用部分器件 (8) 1. LED简介 (8) 2. 光敏电阻简介 (9) 3. 直流电机简介 (9) 4. 电位器简介 (10) 4. Arduino平台应用开发实例 (10) 4.1【实作项目一】利用LED作光敏电阻采样实验 (10) 4.2【实作项目二】利用PWM信号控制LED亮度 (12) 4.3【实作项目三】单键控制一只LED的亮灭 (15) 4.4【实作项目四】利用PWM控制直流电机转速 (17) 4.5【实作项目五】利用电位器手控LED亮度 (19) 4.6【实作项目六】控制LED明暗交替 (21) 4.7【实作项目七】利用光敏电阻控制LED的亮灭 (23) ARDUINO入门及其简单实验(7例) 1. Arduino硬件开发平台简介 Arduino硬件是一块带有USB的I/O接口板(其中包括13条数字I/O引脚,6通道模拟输出,6通道模拟输入),并且具有类似于Java、C语言的集成开发环境。Arduino 既可以扩展一些外接的电子元器件,例如开关、传感器、LED、直流马达、步进马达或其他输入、输出装置;Arduino也可以独立运行,成为一个可以跟交互软件沟通的接口装置,例如:Flash、Processing、Max/MSP、VVVV或其他互动软件。Arduino 开发环境IDE全部开放源代码,可以供大家免费下载、利用,还可以开发出更多激发人们制作欲望的互动作品。

Arduino编程语言

Arduino编程参考手册 首页 程序结构变量基本函数

程序结构 (本节直译自Arduino官网最新Reference) 在Arduino中, 标准的程序入口main函数在内部被定义, 用户只需要关心以下两个函数: setup() 当Arduino板起动时setup()函数会被调用。用它来初始化变量,引脚模式,开始使用某个库,等等。该函数在Arduino板的每次上电和复位时只运行一次。 loop() 在创建setup函数,该函数初始化和设置初始值,loop()函数所做事的正如其名,连续循环,允许你的程序改变状态和响应事件。可以用它来实时控制arduino板。 示例:

控制语句 if if,用于与比较运算符结合使用,测试是否已达到某些条件,例如一个输入数据在某个范围之外。使用格式如下: 该程序测试value是否大于50。如果是,程序将执行特定的动作。换句话说,如果圆括号中的语句为真,大括号中的语句就会执行。如果不是,程序将跳过这段代码。大括号可以被省略,如果这么做,下一行(以分号结尾)将成为唯一的条件语句。

圆括号中要被计算的语句需要一个或多个操作符。 if...else 与基本的if语句相比,由于允许多个测试组合在一起,if/else可以使用更多的控制流。例如,可以测试一个模拟量输入,如果输入值小于500,则采取一个动作,而如果输入值大于或等于500,则采取另一个动作。代码看起来像是这样:

else中可以进行另一个if测试,这样多个相互独立的测试就可以同时进行。每一个测试一个接一个地执行直到遇到一个测试为真为止。当发现一个测试条件为真时,与其关联的代码块就会执行,然后程序将跳到完整的if/else结构的下一行。如果没有一个测试被验证为真。缺省的else语句块,如果存在的话,将被设为默认行为,并执行。 注意:一个else if语句块可能有或者没有终止else语句块,同理。每个else if分支允许有无限多个。

Arduino初学系列3:Arduino,按键,LED

3 Arduino,按键,LED 3.1 问题描述:如何采用Arduino控制器和按键同时控制LED的闪烁 在前面的2个例子中,都是简单地通过将程序烧录到Arduino控制板,然后由控制板来控制LED灯的闪烁,缺乏人情味。那能不能在Arduino控制的过程中,再加上与人的互动呢?答案是肯定的。在这个实验中,我们将增加一个新的材料按键按钮来和Arduino一起控制灯的闪烁。 3.2 所需材料 表3-1:所需材料 序号名称数量作用备注 1 Arduino软件1套提供IDE环境最新版本1.05 2 Arduino UNO开发板1块控制主板各种版本均可 3 USB线1条烧录程序随板子配送 4 杜邦线若干条连接组件 5 发光二极管(LED)1个 LED闪烁 6 电阻(10,200Ω)2个限流 7 多功能面包板1块连接 8 按键按钮1个开关 在进行实验之前,我们先介绍按键按钮的相关属性。 按键按钮 按键是一种经常使用的设备,通过按键可以输入指令和数据来控制电路的开与关,从而达到控制某些设备的运行状态。在本实验中,通过给按键输入高低电平来控制LED灯的闪烁。开关的种类繁多复杂,比如厨房用的单孔开关,卧房用的双控开关,楼道用的声控开关等等,均属于开关的范畴。在我们实验中,主要是用微型开关,但其种类也很多,如图3-1所示。 图3‐1 微型按键开关种类 在本实验中采用的微型开关大致为6*6*5mm的四脚开关。如图3-2所示。

图3-2 本实验用的按键 值得注意的是,1和2是一边的,3和4是一边的,中间有道痕分开。其原理如图3-3所示,当按键按下去时,1,2,3,4四个管脚接合在一起,2根导线连通,变成一根导线。电路导通,起到触发(关)作用。当松开按钮,1,2,3,4四个管脚断开,起到开的作用。 图3‐3 按键按钮原理图 3.3 实验原理图 当按键按钮按下,获取一个高电平,触发在Arduino控制下的LED闪烁。当然,我们也可以设置为按键按下是LED灯不亮,当松开按键时,LED灯闪烁,请看后面的代码分析。原理图如3-4所示,就是在实验1的基础上增加一个按键按钮。

第十五课 Arduino 教程-- Arduino IO函数

第十五课Arduino I/O函数 Arduino板上的引脚可以配置为输入或输出。我们将在这些模式下解释引脚的功能。重要的是要注意,大多数Arduino模拟引脚可以按照与数字引脚完全相同的方式进行配置和使用。 引脚配置为INPUT Arduino引脚默认配置为输入,因此在使用它们作为输入时,不需要使用 pinMode()显式声明为输入。以这种方式配置的引脚被称为处于高阻抗状态。输入引脚对采样电路的要求非常小,相当于引脚前面的100兆欧的串联电阻。 这意味着将输入引脚从一个状态切换到另一个状态所需的电流非常小。这使得引脚可用于诸如实现电容式触摸传感器或读取LED作为光电二极管的任务。 被配置为pinMode(pin,INPUT)的引脚(没有任何东西连接到它们,或者有连接到它们而未连接到其他电路的导线),报告引脚状态看似随机的变化,从环境中拾取电子噪音或电容耦合附近引脚的状态。 上拉电阻 如果没有输入,上拉电阻通常用于将输入引脚引导到已知状态。这可以通过在输入端添加上拉电阻(到5V)或下拉电阻(接地电阻)来实现。10K电阻对于上拉或下拉电阻来说是一个很好的值。 使用内置上拉电阻,引脚配置为输入 Atmega芯片内置了2万个上拉电阻,可通过软件访问。通过将pinMode()设置为INPUT_PULLUP可访问这些内置上拉电阻。这有效地反转了INPUT模式的行为,其中HIGH表示传感器关闭,LOW表示传感器开启。此上拉的值取决于所使用的微控制器。在大多数基于AVR的板上,该值保证在20kΩ和50kΩ之间。在Arduino Due上,它介于50kΩ和150kΩ之间。有关确切的值,请参考板上微控制器的数据表。 当将传感器连接到配置为INPUT_PULLUP的引脚时,另一端应接地。在简单开关的情况下,这会导致当开关打开时引脚变为高电平,当按下开关时引脚为低电平。上拉电阻提供足够的电流来点亮连接到被配置为输入的引脚的LED。如果项目中的LED似乎在工作,但很昏暗,这可能是发生了什么。 控制引脚是高电平还是低电平的相同寄存器(内部芯片存储器单元)控制上拉电阻。因此,当引脚处于INPUT模式时,配置为有上拉电阻导通的引脚将被开启;如果引脚通过

Arduino可穿戴开发入门教程

Ard duin no 可可穿(内ww 穿戴开内部资料大学霸ww.daxue 开发料) 霸 https://www.wendangku.net/doc/b511524678.html, 发入门门教 教程

前 言 在可穿戴技术高度被关注的今天,可穿戴技术与最热开源硬件Arduino碰撞到一起,迸发闪亮的火花——LilyPad。LilyPad是Arduino官方出品的一款为可穿戴和电子织设计的微控制器板。除了微控制器之外,它还提供了配套的一系列外设,如LED、振动马达、蜂鸣器以及三轴陀螺仪等。 在本教材中,针对LilyPad的特点和定位,以不同于其他Arduino系列控制板的方式对LilyPad是什么,以及它可以做什么进行了详细的介绍。 最后,在教程中还实现了3个切实可用的项目。大家只要将他们缝纫起来就可以使用了。特别是最后的POV手环,那是非常炫酷的。 许多教材是在学习的同时做出项目,而本教材则更偏向在做项目的同时学习。在做完所有这些项目之后,你的眼界将会被开阔,各种奇思妙想会接踵而至。你一定会在有限的LilyPad硬件上做出无限可能的设计。 1.学习所需的系统和软件  的开发可以在三大主流操作系统Windows、OS X和Linux上进行,本教材主要集中?Arduino 在Windows操作系统;  的开发环境是Arduino IDE,它的安装和使用都非常方便,在教材中也有所介绍。 ?Arduino 2.学习建议 大家购买器件之前,建议大家先初略阅读本书内容,以确定项目中可能需要用到的器件。这样可以避免重复多次购买,或者购买到不需要的器件。

目 录 第1章 LilyPad Arduino概览 (1) 1.1 可穿戴技术和电子织物 (1) 1.2 LilyPad各模块简介 (1) 1.2.1 控制器板 (1) 1.2.3 输出模块 (3) 1.2.4 输入模块 (3) 1.2.5 电源模块 (4) 1.2.6 编程器模块 (5) 1.2.7 LilyPad套装 (5) 1.3 缝纫基础 (6) 1.4 LilyPad和LilyPad Simple (10) 1.4.1 LilyPad (10) 1.4.2 LilyPad Simple (11) 1.5 本书写作思想 (12) 第2章开发环境 (13) 2.1 Arduino IDE (13) 2.1.1 安装包下载 (13) 2.1.2 Windows平台下安装Arduino IDE (15) 2.1.3 Linux平台下安装Arduino IDE (18) 2.2 认识IDE (18) 2.2.1 启动Arduino IDE (18) 2.2.2 新建源文件 (20) 2.2.3 编辑源文件 (21) 2.2.4 保存源文件 (23) 2.2.5 打开已经存在的源文件 (24) 2.3 连接LilyPad (25) 2.3.1 Windows平台的驱动 (25) 2.3.2 Linux平台的驱动 (26) 2.4 Blink (27) 2.4.1 打开官方示例 (27) 2.4.2 连接硬件 (28) 2.4.3 选择板子 (28) 2.4.4 选择端口 (29) 2.4.5 上传程序 (31) 2.4.6 观察运行结果 (31) 第3章Arduino语言基础 (33)

Arduino BLE 函数库中文

备注: Arduino Function: BLEPeripheral.connected() (缺失) Arduino BLE 函数库 描述 蓝牙低功耗(BLE)协议从蓝牙规范版本4.0开始。虽然以前的规范只允许制作一种无线UART,但该版本允许更智能的资源使用。结果是适用于大多数具有限制能量需求的芯片的低功率通信。BLE协议由多个角色组成。BLE节点可以作为外设,中央,广播和观察者。 广播角色周期性地发送具有数据的广告包。它不支持建立连接。理论上,广播机构的角色可以用于仅发射机的无线电。 观察者角色收听来自广播对等体的广告数据包中嵌入的数据。 中心是能够建立到对等体的多个连接的设备。中心角色始终是连接的发起者,并且基本上允许设备进入网络。 外设使用广告包来允许中心找到它,并且随后建立与之的连接。BLE协议经过优化,至少在处理能力和内存方面要求极少的外设实现资源。 中央和外围设备不得与客户端和服务器错误。他们之间没有联系。中央和外围设备可以是客户机,服务器或两者,具体取决于应用

数据结构 BLE数据结构分层组成。属性是定义的最小数据实体。属性被分组到服务中,每个服务可以包含零个或多个特征。这些特征又可以包括零个或多个描述符。 每个服务,特征和描述符都由UUID标识。 通用唯一标识符(UUID)是保证(或具有高概率)的全局唯一的128位(16字节)数字。您可以定义自己的UUID或使用标准的UUID。 每个属性都可以有权限。 权限是指定可以对每个特定属性执行哪些操作以及具体安全要求的元数据。 广告包(广播包) 广告包是周边中心知道可用的方式。在广告包中有关于外设的主要信息。广告包长度为31字节,并且必须符合减少内部有效信息数量的特定格式。如果中心想要进一步的信息,它可以发送一个扫描请求来请求另一个称为扫描响应的数据包,以便拥有其他31字节的信息。如果您没有足够的数据传输,并且31字节(或62个最终)广告数据包就足够了,您可以实现广播者角色并传输数据,而无需建立连接。如果您有更多的数据要传输,则必须执行外设角色进行传输。 有关广告包的进一步信息可以在此链接中找到,其中包含对此参数的基本介绍。 更多信息 在本节中,我们尝试简要介绍BLE标准。然而,BLE标准比这更广泛。如果你想加深一些争论,那里是链接到BLE标准规范: https://https://www.wendangku.net/doc/b511524678.html,/specifications/bluetooth-core-specification 有关BLE的其他有用信息及其在nRF52上的工作方式可以在北欧半导体网站上找到:https://https://www.wendangku.net/doc/b511524678.html,/index.jsp 北欧还提供了一个有用的应用程序,通过BLE与您的板进行交互。使用此应用程序可以读写特性并调试BLE通信: https://https://www.wendangku.net/doc/b511524678.html,/eng/Products/Nordic-mobile-Apps/nRF-Connect-for -mobile-previously-called-nRF-Master-Control-Panel 相关功能

Arduino 电子积木基础套装中文教程

Arduino 入门版使用教程 V0.2
https://www.wendangku.net/doc/b511524678.html,
Arduino 入门版使用教程
DFRduino Starter kit User Manual
版本号:V 0.22 最后修订日:2010 09 10
仅供内部评测使用,请勿外传
第 1 页 共 90 页

Arduino 入门版使用教程 V0.2
https://www.wendangku.net/doc/b511524678.html,
目录
介绍 ......................................................................................................................................................... 3 元件清单 ............................................................................................................................................. 3 Arduino 介绍篇 .................................................................................................................................... 4 概 述 ................................................................................................................................................... 4 Arduino C 语觊介绍............................................................................................................................. 5 结极 ..................................................................................................................................................... 8 功能 ..................................................................................................................................................... 8 Arduino 使用介绍............................................................................................................................... 10 面包板使用介绍 ................................................................................................................................... 29 实验篇 ................................................................................................................................................... 31 第一节 多彩 led 灯实验 ................................................................................................................. 31 第二节 蜂鸣器实验 ......................................................................................................................... 42 第三节 数码管实验 ......................................................................................................................... 47 第四节 按键实验 ............................................................................................................................. 54 第五节 倾斜开关实验 ..................................................................................................................... 64 第六节 光控声音实验 ................................................................................................................... 68 第七节 火焰报警实验 ................................................................................................................... 71 第八节 抢答器实验 ......................................................................................................................... 75 第九节 温度报警实验 ..................................................................................................................... 80 第十节 红外遥控 ............................................................................................................................. 84
仅供内部评测使用,请勿外传
第 2 页 共 90 页

Arduino知识集锦

#Arduino 语法 setup() 初始化函数 loop() 循环体函数 控制语句类似于C //if if...else for switch case while do... while break continue return got o 扩展语法类似于C //;(分号) {}(花括号) //(单行注释) /* */(多行注释) #define #include 算数运算符类似于C //=(赋值运算符) +(加) -(减) *(乘) /(除) %(模) 比较运算符类似于C //==(等于) !=(不等于) <(小于) >(大于) <=(小于等于) >=(大于等于) 布尔运算符类似于C //&&(与) ||(或) !(非) 指针运算符类似于C //* 取消引用运算符 & 引用运算符 位运算符类似于C & (bitwise and) | (bitwise or) ^ (bitwise xor) ~ (bitwise not) << (bitshift left) >> (bit shift right) 复合运算符类似于C ++ (increment) -- (decrement) += (compound addition) -= (compound subtraction) *= (compound multiplication) /= (compound division) &= (compound bitwise and) |= (c ompound bitwise or) 常量 constants 预定义的常量 BOOL true false 引脚电压定义,HIGH和LOW【当读取(read)或写入(write)数字引脚时只有两个可能的值: HIGH 和 LOW 】 HIGH(参考引脚)的含义取决于引脚(pin)的设置,引脚定义为INPUT或OUTPUT时含义有所不同。当一个引脚通过pinMode被设置为INPUT,并通过digitalRead读取(read)时。如果当前引脚的电压大于等于3V,微控制器将会返回为HIGH。引脚也可以通过pinMode

Arduino常用函数精编版

(1)pinMode(接口名称,OUTPUT或INPUT),将指定的接口定义为输入或输出接口,用在setup()函数里。 (2)digitalWrite(接口名称,HIGH(高)或LOW(低)),将数字输入输出接口的数值置高或置低。 (3)digitalRead(接口名称),读出数字接口的值,并将该值作为返回值。 (4)analogWrite(接口名称,数值),给一个模拟接口写入模拟值(PWM脉冲)。数值取值0-255。 (5)analogRead(接口名称),从指定的模拟接口读取数值,Arduino对该模拟值进行数字转换,这个方法将输入的0~5V电压值 转换为0~1023间的整数值,并将该整数值作为返回值。 (6)delay(时间),延时一段时间,以毫秒为单位,如1000为1秒。 (7)Serial.begin(波特率),设置串行每秒传输数据的速率(波特率)。在与计算机进行通讯时,可以使用下面这些值:300、1200、2400、4800、9600、14400、19200、28800、38400、57600或115200,一般9600、57600和115200比较常见。除此之外还可以使用其他需要的特定数值,如与0号或1号引脚通信就需要特殊的波特率。该函数用在setup()函数里。 Serial.available() 的意思是:返回串口缓冲区中当前剩余的字符个数。一般用这个函数来判断串口的缓冲区有无数据,当Serial.available()>0时,说明串口接收到了数据,可以读取;

Serial.read()指从串口的缓冲区取出并读取一个Byte的数据,比如有设备通过串口向Arduino发送数据了,我们就可以用Serial.read()来读取发送的数据。 while(Serial.available()>0) { data= Serial.read(); delay(2); } (8)Serial.read(),读取串行端口中持续输入的数据,并将读入的数据作为返回值。 (9)Serial.print(数据,数据的进制),从串行端口输出数据。Serial.print(数据)默认为十进制,相当于Serial.print(数据,十进制)。 (10)Serial.println(数据,数据的进制),从串行端口输出数据,有所不同的是输出数据后跟随一个回车和一个换行符。但是该函数所输出的值与Serial.print()一样。 常用函数 数字I/O类: pinMode(pin,mode)数字IO口输入输出模式定义函数,将接口定义为输入或输出接口。

Arduino教程(非常适合初学者)

Arduino 教程一 数字输出 教程一:
Arduino, 教程 11 Comments ?
Arduino 的数字 I/O 被分成两个部分,其中每个部分都包含有 6 个可用的 I/O 管脚,即管脚 2 到管脚 7 和管脚 8 到管脚 13。除了管脚 13 上接了一个 1K 的电阻之外,其他各个管脚都直接连接到 ATmega 上。我们可以利用一个 6 位的数字跑马灯,来对 Arduino 数字 I/O 的输出功能进行验证,以下是相应的原理图: 电路中在每个 I/O 管脚上加的那个 1K 电阻被称为限流电阻, 由于发光二极管在电路中没有等效电阻值, 使用限流电阻可 以使元件上通过的电流不至于过大,能够起到保护的作用。 该工程对应的代码为:
int BASE = 2; int NUM = 6; int index = 0; void setup() { for (int i = BASE; i < BASE + NUM; i ++) { pinMode(i, OUTPUT); } } void loop() { for (int i = BASE; i < BASE + NUM; i ++) { digitalWrite(i, LOW); } digitalWrite(BASE + index, HIGH); index = (index + 1) % NUM; delay(100); }
下载并运行该工程,连接在 Arduino 数字 I/O 管脚 2 到管脚 7 上的发光二极管会依次点亮 0.1 秒,然后再熄灭:
1

这个实验可以用来验证数字 I/O 输出的正确性。Arduino 上一共有十二个数字 I/O 管脚,我们可以用同样的办法验证其他六个管脚的正 确性,而这只需要对上述工程的第一行做相应的修改就可以了:
int BASE = 8;
SEP
01
Arduino 教程二 数字输入 教程二:
Arduino, 教程 3 Comments ?
在数字电路中开关(switch)是一种基本的输入形式,它的作用是保持电路的连接或者断开。Arduino 从数字 I/O 管脚上只能读出高电 平(5V)或者低电平(0V),因此我们首先面临到的一个问题就是如何将开关的开/断状态转变成 Arduino 能够读取的高/低电平。解 决的办法是通过上/下拉电阻,按照电路的不同通常又可以分为正逻辑(Positive Logic)和负逻辑(Inverted Logic)两种。 在正逻辑电路中,开关一端接电源,另一端则通过一个 10K 的下拉电阻接地,输入信号从开关和电阻间引出。当开关断开的时候, 输入信号被电阻“拉”向地,形成低电平(0V);当开关接通的时候,输入信号直接与电源相连,形成高电平。对于经常用到的按压式 开关来讲,就是按下为高,抬起为低。 在负逻辑电路中,开关一端接地,另一端则通过一个 10K 的上拉电阻接电源,输入信号同样也是从开关 和电阻间引出。当开关断开时,输入信号被电阻“拉” 向电源,形成高电平(5V);当开关接通的时候,输 入信号直接与地相连,形成低电平。对于经常用到的 按压式开关来讲,就是按下为低,抬起为高。 为了验证 Arduino 数字 I/O 的输入功能,我们可以将 开关接在 Arduino 的任意一个数字 I/O 管脚上(13 除 外),并通过读取它的接通或者断开状态,来控制其 它数字 I/O 管脚的高低。本实验采用的原理图如下所 示,其中开关接在数字 I/O 的 7 号管脚上,被控的发 光二极管接在数字 I/O 的 13 号管脚上:
Arduino 教程三 模拟输入 教程三:
Arduino, 教程 5 Comments ?
2

arduino语法手册函数部分

; Arduino 语法手册函数部分 摘自:函数部分 数字 I/O pinMode() 描述 将指定的引脚配置成输出或输入。详情请见digital pins。 语法 pinMode(pin, mode) # 参数 pin:要设置模式的引脚 mode:INPUT或OUTPUT 返回 无 例子 ledPin = 13 语法 … noTone(pin) 参数 pin: 所要停止产生声音的引脚 返回 无 shiftOut() shiftOut() ) 描述 将一个数据的一个字节一位一位的移出。从最高有效位(最左边)或最低有效位(最右边)开始。依次向数据脚写入每一位,之后时钟脚被拉高或拉低,指示刚才的数据有效。 注意:如果你所连接的设备时钟类型为上升沿,你要确定在调用shiftOut()前时钟脚为低电平,如调用digitalWrite(clockPin, LOW)。 注意:这是一个软件实现;Arduino提供了一个硬件实现的SPI库,它速度更快但只在特定

脚有效。 语法 shiftOut(dataPin, clockPin, bitOrder, value) 参数 dataPin:输出每一位数据的引脚(int) clockPin:时钟脚,当dataPin有值时此引脚电平变化(int) bitOrder:输出位的顺序,最高位优先或最低位优先 value: 要移位输出的数据(byte) ^ 返回 无 shiftIn() 描述 将一个数据的一个字节一位一位的移入。从最高有效位(最左边)或最低有效位(最右边)开始。对于每个位,先拉高时钟电平,再从数据传输线中读取一位,再将时钟线拉低。 注意:这是一个软件实现;Arduino提供了一个硬件实现的SPI库,它速度更快但只在特定脚有效。 语法 《 shiftIn(dataPin,clockPin,bitOrder) 参数 dataPin:输出每一位数据的引脚(int) clockPin:时钟脚,当dataPin有值时此引脚电平变化(int) bitOrder:输出位的顺序,最高位优先或最低位优先 返回 读取的值(byte) pulseIn() 描述 《 读取一个引脚的脉冲(HIGH或LOW)。例如,如果value是HIGH,pulseIn()会等待引脚变为HIGH,开始计时,再等待引脚变为LOW并停止计时。返回脉冲的长度,单位微秒。如果在指定的时间内无脉冲函数返回。 此函数的计时功能由经验决定,长时间的脉冲计时可能会出错。计时范围从10微秒至3分钟。(1秒=1000毫秒=1000000微秒) 语法 pulseIn(pin, value) pulseIn(pin, value, timeout) 参数

《Arduino轻松学》慕课课程

《Arduino轻松学》慕课课程 学员手册 中国青少年科技辅导员协会 北京智感科技有限公司 二〇一七年十月

目录 一、欢迎辞 (1) 二、慕课课程介绍 (2) 2.1 学习目标 (2) 2.2 学习内容 (2) 2.3 学习方式 (4) 2.4 学习成果 (4) 2.4 学习奖励 (6) 三、在线学习平台使用说明 (6) 四、课程进度 (8) 五、讲师介绍 (9) 六、课程管理团队 (9)

一、欢迎辞 欢迎选修《Arduino轻松学》慕课课程! 《Arduino轻松学》是科普中国校园e站资源服务示范项目提供的通用性服务课程之一,面向项目示范校和所有科技辅导员开放。 科普中国校园e 站资源服务示范项目是在中国科协科普部指导下,由中国科协青少年科技中心和中国青少年科技辅导员协会联合推动的一项科普信息化建设工作,旨在为学校和科技辅导员利用信息化手段和科普中国的丰富科普教育资源开展线上线下相结合的青少年科技教育活动提供服务。示范项目携手各科技教育活动、STEM 课程和创客课程开发团队,不断为项目示范校提供多种在线课程服务。 Arduino作为目前热门的开源硬件平台,已经形成了完整的教育生态系统。借助其丰富的传感器及输入输出模块,只需简单的硬件连接,便可快速的实现有趣的交互体验,非常有利于科技辅导员激发学生兴趣、设计动手及实践体验课程。 本学习手册主要包括:课程介绍、在线学习平台使用说明、课程学习日程等。希望为各位学员尽快熟悉课程教学节奏、掌握课程学习方法提供帮助。望各位学员能够认真阅读学习手册。如有其它问题,欢迎在学习过程中给出您的反馈。 祝愿我们一起有一次愉快的在线学习之旅!也希望您在学习过程中主动关注课程邮件,真正成为学习的主人! 中国青少年科技辅导员协会 北京智感科技有限公司 二〇一七年十月

Arduino-教程-第15课-Arduino-IO函数

第15课Arduino I/O函数 Arduino函数库 Arduino函数库 1.Arduino I/O函数 2.Arduino 高级I/O函数 3.Arduino 字符函数 4.Arduino 数学库 5.Arduino 三角函数 Arduino板上的引脚可以配置为输入或输出。我们将在这些模式下解释引脚的功能。重要的是要注意,大多数Arduino模拟引脚可以按照与数字引脚完全相同的方式进行配置和使用。 引脚配置为INPUT Arduino引脚默认配置为输入,因此在使用它们作为输入时,不需要使用 pinMode()显式声明为输入。以这种方式配置的引脚被称为处于高阻抗状态。输入引脚对采样电路的要求非常小,相当于引脚前面的100兆欧的串联电阻。 这意味着将输入引脚从一个状态切换到另一个状态所需的电流非常小。这使得引脚可用于诸如实现电容式触摸传感器或读取LED作为光电二极管的任务。 被配置为pinMode(pin,INPUT)的引脚(没有任何东西连接到它们,或者有连接到它们而未连接到其他电路的导线),报告引脚状态看似随机的变化,从环境中拾取电子噪音或电容耦合附近引脚的状态。 上拉电阻 如果没有输入,上拉电阻通常用于将输入引脚引导到已知状态。这可以通过在输入端添加上拉电阻(到5V)或下拉电阻(接地电阻)来实现。10K电阻对于上拉或下拉电阻来说是一个很好的值。 使用内置上拉电阻,引脚配置为输入 Atmega芯片内置了2万个上拉电阻,可通过软件访问。通过将pinMode()设置为 INPUT_PULLUP可访问这些内置上拉电阻。这有效地反转了INPUT模式的行为,其中HIGH表示传感器关闭,LOW表示传感器开启。此上拉的值取决于所使用的微控制器。在大多数基于AVR的板上,该值保证在20kΩ和50kΩ之间。在Arduino Due上,它介于50kΩ和150kΩ之间。有关确切的值,请参考板上微控制器的数据表。 当将传感器连接到配置为INPUT_PULLUP的引脚时,另一端应接地。在简单开关的情况下,这会导致当开关打开时引脚变为高电平,当按下开关时引脚为低电平。上拉电阻提供足够的电流来点亮连接到被配置为输入的引脚的LED。如果项目中的LED似乎在工作,但很昏暗,这可能是发生了什么。 控制引脚是高电平还是低电平的相同寄存器(内部芯片存储器单元)控制上拉电阻。因此,当引脚处于INPUT模式时,配置为有上拉电阻导通的引脚将被开启;如果引脚通过

《Arduino开发从入门到实战》教学大纲

《Arduino开发从入门到实战》课程教学大纲 课程编号 课程名称中文Arduino开发从入门到实战 英文Arduino Development from Beginning to Practice 教学目的和要求 课程说明本课程主要通过“基础知识→模块实验→项目实战”的思路,由浅入深,先易后难,先简单后综述地引导学生进行学习和逐步提高,分层激发学生的学习兴趣。 教学目的通过本课程的学习,可以使Arduino的初学者轻松入门,并通过本书中手把手地项目教学方式,使学生掌握Arduino项目开发的完整过程。 教学要求本书共15章,建议教学学时为64学时,其中理论32学时,实验32学时(普通实验20学时,综合实验12学时),该课程的先导课程为电路分析、模拟电路、单片机基础等。 教学内容和要求(分章节) 教学方法与学时分配 本课程采用“基础知识+模块实验+项目实战”的教学方式进行教学,采用现代化授课手段,在课堂上可以根据实际情况取舍教学内容,动态调整,力争与国际接轨,从而达到较好的教学效果。 学时分配 章节 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 合计 授课 3 6 8 15 2 2 2 2 2 2 2 2 2 2 12 64 学时

主要内容及基本要求 第一章Arduino 概述 基本内容:本章主要对“Arduino开发从入门到实战”这门课进行了一个总体的概述,给出了Arduino 的起源、Arduino可以干什么、创客文化、Arduino开源文化、发展趋势以及几个关于Arduino的趣味小实例。 基本要求:要求学生掌握Arduino的概念、基本作用及Arduino与其他单片机相比具有的优势,了解Arduino发展进程、开源文化基本内容。 第二章Arduino 硬件资源 基本内容:本章介绍Arduino的硬件部分,包括Arduino核心ATmega32xx系列单片机、ATmega32xx 主要特性、典型的Arduino开发板与扩展板及Arduino其他类型的衍生控制器。 基本要求:要求学生掌握Arduino硬件组成、Arduino Uno 各引脚功能等特性。熟悉几款常用的Arduino 的开发板与扩展板,了解其功能及使用方法。 第三章开发环境 基本内容:本章介绍了Arduino的软件部分,包括开发环境、集成开发环境(IDE)、驱动安装、IDE基本操作、程序的输入、编译与下载以及解决开发环境的常见问题。 基本要求:要求学生能够掌握Arduino的驱动与安装、如何烧录程序。熟悉Arduino编译环境,了解Arduino IDE 的基本特点,菜单栏各个部分的功能与作用,掌握基本功能快捷键,能够完成Arduino实验板的编程写入。 第四章Arduino 语言 基本内容:本章介绍Arduino的语言、基本函数、Arduino库函数三大部分。其中Arduino的语言主要包括标识符、关键字、Arduino语言运算符、控制语句、基本结构等。Arduino基本函数主要有数字I/O、模拟I/O、时间函数等。 基本要求:要求学生掌握Arduino编程格式、Arduino语言结构,熟悉Arduino函数的书写规范,了解使用库函数的方法。 第五章炫酷LED灯 基本内容:本章介绍炫酷LED灯实验,通过实验使LED闪烁发光。使用Arduino Uno开发板、发光二极管、杜邦线、面包板等完成硬件连接,软件部分使用数字I/O函数完成代码编写,最后完成扩展实验部分。 基本要求:掌握LED发光二极管的基本原理,了解LED在生活中的应用,熟悉Arduino Uno硬件连接、软件编程过程,掌握数字I/O函数语言结构。 第六章按键开关的输入 基本内容:本章介绍了按键开关输入实验,通过实验使LED闪烁发光。使用Arduino Uno开发板、按键开关、发光二极管、杜邦线、面包板,通过按下按键使LED发光、松手LED 熄灭。软件部分使用基本数字I/O函数编写代码,最后完成扩展实验部分。 基本要求:掌握按键开关的基本原理,熟悉LED发光二极管的基本原理,了解按键开关的种类及其在生活中的应用,熟悉Arduino Uno硬件连接、软件编程过程,掌握数字I/O函数语言结构。 第七章触摸延时开关

相关文档