Arduino学习笔记~(1)

来源:互联网 发布:淘宝省钱网站 编辑:程序博客网 时间:2024/05/29 13:20

     第一次的话,先总结一下所学的吧。首先是i/o口,通过引脚发送和接受电信号来传递信息,达到控制元件。这里分为数字信号与模拟信号,在Arduino uno板数字信号为0v和5v,模拟信号是0v至5v。模拟信号通过不同占空比的pwm波来实现变化。比较直观的是呼吸灯的例子,当输出的是数字信号时,变化是亮与灭,而当输出的是模拟信号时,灯就有一个明亮变化的过程。模拟信号比数字信号更容易达到一个控制的效果,比如呼吸灯,比如后面要提的舵机。【其实还有一些有关定时器、快速pwm波和相位pwm波的内容,但是感觉还没有掌握好…觉得放在以后的笔记中比较妥:)】

然后接触的是servo库,也就是到了和舵机有关的部分啦。我的第一感觉就是接触到了一个好好玩的东西,机器臂的转向控制啦,遥控车的方向控制啦,甚至螺旋桨方面(会不会转速不够?)都可以应用上去,加上其他几种电机的话就可以做出好多好玩的东西。【中途插一下:在网上看到了有个人的笔记,大意是记录原本质疑servo库不够精准、pwm波频率不可调控于是直接输出pwm波对舵机进行控制。后来他查源代码发现这些都是瞎操心…可以看出Arduino库还是很强大的:)…不过直接输出pwm波也可以在以后进行尝试】

百度得出以下信息:采用的是9g舵机。舵机的基准信号周期为20ms,宽度为1.5ms。舵机的工作电压是4.2v(也有说4.8v…)~6v,GND连GND,VCC连5V引脚,信号线连9号引脚。

以下是程序。

#include<Servo.h>

 

Servomyservo; 

String comdata ="";

int i;

 

void setup() {

  Serial.begin(9600);

  myservo.attach(9);

}

 

void loop() {

  int pos;

   while (Serial.available() > 0) 

    {

        comdata += char(Serial.read());

        delay(2);    

    }

     if (comdata.length() > 0)

    {

  

        i=comdata.toInt();//在此把comdata转化成INT型数值,以备后续使用

        Serial.println(i);

        comdata = "";//  必须在此把comdata设为空字符,否则会导致前后字符串叠加

    }

 

  for (pos = 0; pos <= i; pos += 1)

  {

    myservo.write(pos);            

    delay(15);                     

    };

 

  delay(1000);

 

}

恩…这里采用了异步串口来控制舵机。【记一下串口通信读入的是ASCLL码…当时不知道这一点废了好大功夫】for循环来改变参数,由于舵机转速不是很快,延时15ms来保证有足够时间使齿轮转动。

算是对servo库和i/o口的一个应用吧…熟练了一下舵机的控制。但我还没有做到的是电机在转过一个角度后就停下,等待下一个数据。目前我的思路有两个,一个是通过中断,一个是直接把程序放到setup里…都有不同程度的利弊…或许以后回过头来再解决这个问题吧。

【其实舵机的原理还是值得记一下的:接受单片机发出的信号将获得的偏置电压与电位器电压比较,获得电位差输出。通过电路板上ic判断转动方向,驱动马达转动。通过减速齿轮将动力传至摆臂,同时由位置检测器送回信号,判断是否到达定位。我想到了通过pwm波来控制角度,但是我没有想到位置检测器…】

这一次的笔记暂时先到这里了..接下来要记录得是A/D转换和中断的内容..然后在补一下前面内容留下的疑问或者探讨的地方..恩大概计划就这样~

0 0