Archive for 2月, 2014

python 与 arduino 串口通信

 
>>> import serial
>>> ser = serial.Serial(8)
>>> ser.timeout=1
>>> ser.close()
>>> ser = serial.Serial(8)
>>> ser.timeout=1
>>> ser.readline()
''
>>> ser.write("11111\n")   # 每个命令以 \n 结尾
6L
>>> ser.readline()
'received: 11111\r\n'
>>> ser.write("11111\n")
6L
>>> ser.write("22222\n33333333\n") # 可以一次发送多个命令,同样以 \n 结尾。
15L
>>> ser.readline()
'received: 11111\r\n'
>>> ser.readline()
'received: 22222\r\n'
>>> ser.readline()
'received: 33333333\r\n'
>>> ser.readline()
''
>>> 
 
char serial_line[100] ="";
int serial_line_length=0;

void setup()
{
  Serial.begin(9600);
  Serial.setTimeout(1000); //串口超时 1000 毫秒
}

void loop()
{
  if (Serial.available() > 0)
  {
    // 读取,读到\n或100字符或超时
    serial_line_length = Serial.readBytesUntil('\n', serial_line, 100);
    serial_line[serial_line_length ]='\0';    // 截断字符串
    Serial.print("received: ");
    Serial.println(serial_line);
  }
}

参考:
http://www.geek-workshop.com/thread-5733-1-1.html
http://wiki.geek-workshop.com/doku.php?id=arduino:arduino_language_reference:serial
http://pythonhosted.org//pyserial/pyserial_api.html

No comment »

ARDUINO 最小系统

atmeg328 内置复位电路,不需要外接复位电路。虽然也有内置晶振,但是 ARDUINO 只支持 16M 或 8M 的频率,所以最小系统还得用 16M 晶振接到9、10口(XTAL1、XTAL2),然后再分别接2个22p的电容到地就可以了。

全新的 atmeg328 没有 ARDUINO 的bootloader(引导程序) ,得用 IPS 接口写进去。之后就可以用串口写程序了。
熔丝位之类的设置不用管,ARDUINO IDE 写bootloader时会自动设置。对了,ARDUINO 的“使用编程器下载”功能会清除 ARDUINO 的bootloader(引导程序),除非资源太紧张,不建议使用。

如果需要复位按钮,可以用一个10K上拉电阻接到1(RESET)脚,然后弄个按钮,一端接到地,一段也接到1(RESET)脚。

还有一个问题,atmeg328 有两个 VCC 口(一个是 A/D 转换器的电源,这个必须接,不然芯片跑不起来,各个脚都是0.5V电压),建议都接到电源上面,如果只接7脚的 VCC ,会悲剧的跑不起来… 今天一上午都弄这个问题了。

附参考:
ARDUINO_V2

atmega328w

Arduino_Uno_Rev3-schematic

No comment »