2019-09-30 11:33:38 weixin_42547619 阅读数 97
  • 少儿编程:Scratch中的Arduino开发

    本门课程将介绍如何以Scratch的编程方式进行Arduino开发(需购买硬件,详情可以参考教程内容)。 课程包含16个小模块的调用,并以案例形式发散思维,对应生活中随处可见的场景。(如红绿灯、楼道声控开灯,火焰报警、电动车碰撞报警、触摸传感器开启灯/风扇、高温开启风扇、天黑打开路灯,厕所冲水设备等) 每节正式课程包含连接硬件和代码编写两个环节,如果是孩子学习,请家长做好监督看护工作。 我相信,编程对孩子的思维培养和好奇心的激发是确实存在益处的,希望每一个观众能够有所收获。 课程适合人群:对编程感兴趣的青少年;有意培养子女编程兴趣的家长;有意从事少儿编程相关工作的朋友。

    1470 人正在学习 去看看 王全
  1. JS的发展可以说是很迅猛从ECMA5 到ECMA6.其系统是越来越庞大。从原生到各种JS框架林立,从单纯的前端,到复杂的后端系统。使得越来越多的前端程序员也可以上手后端开发。Node.js是基于Chrome JavaScript运行时建立的一个平台,实际上它是对Google Chrome V8引擎进行了封装,它主要用于创建快速的、可扩展的网络应用。Node.js采用事件驱动和非阻塞I/O模型,使其变得轻微和高效,非常适合构建运行在分布式设备的数据密集型实时应用。
    运行于浏览器的Javascript,浏览器就是Javascript代码的解析器,而Node.js则是服务器端JS的代码解析器,存于服务器端的JS代码由Node.js来解析和应用。
    本期采用node的串口实现与Arduino单片机的通讯:
    单片机:arduino uno

打开arduino LED 新建Serial文件,写入代码

本地图片,请重新上传图片

 int led=13;//测试灯

char getstr; 

void setup() 

{ 

  Serial.begin(9600); 

}

void loop() 

{ 

  getstr=Serial.read(); 

  Serial.println("a"); //给node.js发个a

  if(getstr=='a'){

    digitalWrite(led,HIGH); 

    Serial.println(getstr); 

  }

  else if(getstr=='b'){//收到b就关灯了

    digitalWrite(led,LOW); 

    Serial.print(getstr); 

  }

 delay(500);

while(1);

}
  1. OK 下载代码 单片机搞定。
    在电脑上安装npm后,在项目文件里面建立Serial.js文件,先执行安装serial 模块 :npm install serialport
    然后就可以写代码啦。
var SerialPort = require('serialport');
var port = new SerialPort('COM5',{ autoOpen: false,
    baudRate: 9600,//波特率
    dataBits: 8, //数据位
    parity: 'none', //奇偶校验
    stopBits: 1, // 停止位
    flowControl: false,// 流量控制 默认false
    parser: SerialPort.parsers.readline('\n')//去掉数据位后面的回车
})
port.open(function (err) {//打开串口
    if (err) {
        return console.log('Error opening port: ', err.message);
    }
    setTimeout(function() {
        port.write('a');//先发送个a   让单片机开灯
        setTimeout(function(){
            port.write('b');//再先发送个b  让单片机关灯
        },2000)   //这个延时是必须要有的
}, 2000);

});
var bufs = [];

port.on('data', function (buf) {//监听数据接收
    bufs.push(buf.toString("utf-8"));//串口过来的数据的16进制的,这里转成正常的 utf-8
    console.log("from arduino:-->"+buf.toString("utf-8"))
    console.log(bufs)
    if(buf.toString("utf-8")=='a\r'){ 
        console.log("get a")
    }
});
port.on('end', function (buf) {  //数据 接受完毕后的处理函数
    console.log(buf)
    var buf = Buffer.concat(bufs);
    console.log(buf)
});   

OK 运行该文件 node Serial.js后,就可以看到开关灯的效果。串口里也会打印双方接受的到的数据了。

本地图片,请重新上传

2020-01-20 12:13:18 weixin_41659040 阅读数 41
  • 少儿编程:Scratch中的Arduino开发

    本门课程将介绍如何以Scratch的编程方式进行Arduino开发(需购买硬件,详情可以参考教程内容)。 课程包含16个小模块的调用,并以案例形式发散思维,对应生活中随处可见的场景。(如红绿灯、楼道声控开灯,火焰报警、电动车碰撞报警、触摸传感器开启灯/风扇、高温开启风扇、天黑打开路灯,厕所冲水设备等) 每节正式课程包含连接硬件和代码编写两个环节,如果是孩子学习,请家长做好监督看护工作。 我相信,编程对孩子的思维培养和好奇心的激发是确实存在益处的,希望每一个观众能够有所收获。 课程适合人群:对编程感兴趣的青少年;有意培养子女编程兴趣的家长;有意从事少儿编程相关工作的朋友。

    1470 人正在学习 去看看 王全

37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来—小小的进步或是搞不掂的问题,希望能够抛砖引玉。

【Arduino】168种传感器模块系列实验(资料+代码+图形+仿真)

实验五十九: RS232转TTL2代串口模块刷机板模块(MAX3232芯片)

在这里插入图片描述

MAX3232芯片

采用专有低压差发送器输出级,利用双电荷泵在3.0V至5.5V电源供电时能够实现真正的RS-232性能,器件仅需四个0.1uF的外部小尺寸电荷泵电容。max3232确保在120kbps数据速率,同时保持RS-232输出电平。max3232具有二路接收器和二路驱动器,提供1uA关断模式,有效降低功效并延迟便携式产品的电池使用寿命。关断模式下,接收器保持有效状态,对外部设备进行监测,仅消耗1uA电源电流,max3232的引脚、封装和功能分别与工业标准MAX242和MAX232兼容。即使工作在高数据速率下,max3232仍然能保持RS-232标准要求的正负5.0V最小发送器输出电压。

在这里插入图片描述

在这里插入图片描述

MAX3232是MAXIM公司生产的一款 232通讯的芯片,他可以将单片机的逻辑信号的电平转成RS232的电平。因为RS232是用,正负电平来表示0和1的信号,所以MAX3232要产生相应的正负电压。在使用MAX3232时,先确定一下系统接供的电压,因为此芯片,对不同的工作电压,要给不同的电容来产生电压。通电后,先检测一下2脚是否有+5.4V以上的电压,6脚有-5.4V以上的电压,16脚是否有电压, 如没有则要检查相应的电容。注意在16脚一定要有电容,要不然就可能不能产生相应的电压。

在这里插入图片描述
在这里插入图片描述

RS232转TTL2代串口模块刷机板模块(MAX3232芯片)
在这里插入图片描述
DB9管脚功能

1 、DCD( Data Carrier Detect) :载波检测。主要用于Modem通知计算机其处于在线状态,即Modem检测到拨号音,处于在线状态。

2 、RXD(Receive(rx) Data):此引脚用于接收外部设备送来的数据;在你使用Modem时,你会发现RXD指示灯在闪烁,说明RXD引脚上有数据进入(电脑的2接MAX232的RS232端TOUT(如PIN7))。

3 、TXD(Transmit(tx) Data):此引脚将计算机的数据发送给外部设备;在你使用Modem时,你会发现TXD指示灯在闪烁,说明计算机正在通过TXD引脚发送数据。

4 、DTR( Data Terminal Ready ):数据终端就绪;当此引脚高电平时,通知Modem可以进行数据传输,计算机已经准备好。

5 、GND(Ground):逻辑地。

6 、DSR(data set ready):数据设置就绪;此引脚高电平时,通知计算机Modem已经准备好,可以进行数据通讯了。

7 、RTS(Request To Send):请求发送;此脚由计算机来控制,用以通知Modem马上传送数据至计算机;否则,Modem将收到的数据暂时放入缓冲区中。

8 、CTS(Clear to send): 清除发送;此脚由Modem控制,用以通知计算机将欲传的数据送至Modem。

9 、RI ( Ring Indicator): Modem通知计算机有呼叫进来,是否接听呼叫由计算机决定。

要想实现串口间通信,至少需要三个引脚,即:RXD,TXD,GND,RXD与其他串口线TXD相连,TXD与RXD相连,GND与GND相连,这样就实现了串口间通信。该通信是全双工的,即可以同时发送/接收数据,虽然说是串行的,但是因为发送/接收不是用的一个通道,所以可以实现全双工。

在这里插入图片描述
DB9与MAX3232的连接电路图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
模块电原理图
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
实验开源代码

/*

【Arduino】168种传感器模块系列实验(59)

实验五十九: RS232转TTL2代串口模块刷机板模块(MAX3232芯片)

程序之一,读取缓存中的串口数据

注意这里的接线方法,软串口RX接RS232转接板的RX口,

TX接RS232转接板的TX口

*/

 

#include <SoftwareSerial.h>

SoftwareSerial DLSerial(6, 7); // 软串口 RX(D6), TX(D7)

void setup() {

DLSerial.begin(9600); //设备波特率9600

}

 

void loop() {    

DLSerial.write(1); //发送字节数据

DLSerial.write(3);

delay(500);

while (DLSerial.available()>0) //如果缓存中有接收到的数据

{

    DLSerial.read(); //读取缓存中的串口数据

    delay(2);

}

delay(500);

}

在这里插入图片描述
在这里插入图片描述

/*

【Arduino】168种传感器模块系列实验(59)

实验五十九: RS232转TTL2代串口模块刷机板(MAX3232芯片)

程序之二,接收串口数据

rx = 6

tx = 7

*/

 

#include <ctype.h>

 

#define bit9600Delay 100  

#define halfBit9600Delay 50

#define bit4800Delay 188 

#define halfBit4800Delay 94 

 

byte rx = 6;

byte tx = 7;

byte SWval;

 

void setup() {

  pinMode(rx,INPUT);

  pinMode(tx,OUTPUT);

  digitalWrite(tx,HIGH);

  delay(2);

  digitalWrite(13,HIGH); 

  SWprint('o');  

  SWprint('k');

  SWprint(10);

}

 

void SWprint(int data)

{

  byte mask;

 

  digitalWrite(tx,LOW);

  delayMicroseconds(bit9600Delay);

  for (mask = 0x01; mask>0; mask <<= 1) {

    if (data & mask){ 

     digitalWrite(tx,HIGH); 

    }

    else{

     digitalWrite(tx,LOW); 

    }

    delayMicroseconds(bit9600Delay);

  }

  

  digitalWrite(tx, HIGH);

  delayMicroseconds(bit9600Delay);

}

 

int SWread()

{

  byte val = 0;

  while (digitalRead(rx));

 

  if (digitalRead(rx) == LOW) {

    delayMicroseconds(halfBit9600Delay);

    for (int offset = 0; offset < 8; offset++) {

     delayMicroseconds(bit9600Delay);

     val |= digitalRead(rx) << offset;

    }

    

    delayMicroseconds(bit9600Delay); 

    delayMicroseconds(bit9600Delay);

    return val;

  }

}

 

void loop()

{

    SWval = SWread(); 

    SWprint(toupper(SWval));

}


在这里插入图片描述
实验仿真编程(linkboy)
在这里插入图片描述
在这里插入图片描述

2017-08-24 14:15:31 u010833547 阅读数 2893
  • 少儿编程:Scratch中的Arduino开发

    本门课程将介绍如何以Scratch的编程方式进行Arduino开发(需购买硬件,详情可以参考教程内容)。 课程包含16个小模块的调用,并以案例形式发散思维,对应生活中随处可见的场景。(如红绿灯、楼道声控开灯,火焰报警、电动车碰撞报警、触摸传感器开启灯/风扇、高温开启风扇、天黑打开路灯,厕所冲水设备等) 每节正式课程包含连接硬件和代码编写两个环节,如果是孩子学习,请家长做好监督看护工作。 我相信,编程对孩子的思维培养和好奇心的激发是确实存在益处的,希望每一个观众能够有所收获。 课程适合人群:对编程感兴趣的青少年;有意培养子女编程兴趣的家长;有意从事少儿编程相关工作的朋友。

    1470 人正在学习 去看看 王全

用“SmartConfig技术”控制Esp8266模块连接 路由器的无线网络。


在Arduino通过串口设置ESP8266位服务器模式,并且绑定TCP service端口。


然后 手机等设备通过Tcp协议连接Esp8266模块并发送TCP消息给ESP8266。


arduino通过ESP8266的串口函数获取TCP消息,并处理相关业务(比如,通过io口控制led等开关)。

2015-10-07 08:55:21 ajfgurjfmvvlsfkjglkh 阅读数 1977
  • 少儿编程:Scratch中的Arduino开发

    本门课程将介绍如何以Scratch的编程方式进行Arduino开发(需购买硬件,详情可以参考教程内容)。 课程包含16个小模块的调用,并以案例形式发散思维,对应生活中随处可见的场景。(如红绿灯、楼道声控开灯,火焰报警、电动车碰撞报警、触摸传感器开启灯/风扇、高温开启风扇、天黑打开路灯,厕所冲水设备等) 每节正式课程包含连接硬件和代码编写两个环节,如果是孩子学习,请家长做好监督看护工作。 我相信,编程对孩子的思维培养和好奇心的激发是确实存在益处的,希望每一个观众能够有所收获。 课程适合人群:对编程感兴趣的青少年;有意培养子女编程兴趣的家长;有意从事少儿编程相关工作的朋友。

    1470 人正在学习 去看看 王全

    最近进行Arduinoprocessing串口通信时遇到了这种问题,觉得这篇博文写的很对,就转了下来,在此感谢原博主行走的仙人

    博文原链接:http://guoyunhe.me/?p=565

 

    在网络上普遍存在的ArduinoProcessing互动的例子,都具有一个很简单的构造:Arduino上用Serial.print()发送,在Processing中用Serial.readString()读取,或者反过来。然而实际应用过程中大家就会发现这个简单的逻辑模型会发生莫名其妙的错误。最显著的是有时候会收到空值,即使用Serial.available()检测,也会有时收到间断的字符串或者多个字符串混在一起了。

    下面是一个经典的ProcessingArduino通信实例:

    

//Processing Code
import processing.serial.*;
 
Serial myPort;
 
void setup(){
  myPort= new Serial(this,"/dev/ttyACM0", 115200); //Set Serial Port
 
}
 
void draw(){
 if(myPort.available()>0){
   String message = myPort.readString();
   println(message);
  }
}
//Arduino code
int data=12345;
void setup()
{
 Serial.begin(115200);//rate
}
void loop()
{
 Serial.print(data); //send data
 delay(1000);
}

    然后我们期待着每次获取“12345”并显示在屏幕上,但事与愿违,我们得到的情况是这样的:

    12345

    123

    45

    12345

    12345

    输出时的中断是怎样产生的呢?要探究这个问题的根源,需要重新审视串口通信的原理。

    串口通讯就像一趟公共汽车,每个字节是一个在等车的人。他来到车站(发送数据),车还没有来,所以新来的人就一直等待(缓存)。当公共汽车来了的时候,将这些人一次接走(读取数据),当然车也是有容量的,只能载一定数量的人(缓存大小)。现在有一个旅行团(字符串/字符数组),一部分人走在前面刚刚赶上了车(被读取),而另一部分人没赶上,只能等待下一班车(下一次读取)。另一种情况是,两个旅行团都在车站等车,被同一班车接走了。这就是为什么我们读取的时候字符串会断成两节,或者并起来。

    核心原因是:串口流通的数据都是bytes而没有字符串概念,所有发送数据都会按一个byte一个byte缓存,不论是否是连续字符串;而读取时会取走所有缓存bytes,不论它们是否是一个、半个还是多个字符串。

    ArduinoProcessing的数据收发速度是不一样的。如果用Arduino延时较长时间,Processing可能读取一个字符串或字符串的一部分。如果Arduino延时较短,Processing可能读取多个字符串,但不一定完整。在读取字符串的时候,无法确定上一个字符串是否被读取了,当前字符串是否缓存完毕,因为字符串都已经切成了bytes,连成一串。这个问题是串口通信本身造成的,一定会出现。

    一种解决方法是,通过在接收端缓存数据来解决这个问题。为传输数据设置一个结束标记,如’\n’(换行符),就能在接收到的数据流中识别到一个字符串的结尾。当未遇到结束标记,就一直将串口数据保存在一个buffer变量中,继续接收。

    ProcessingSerialEvent事件类型就提供了这种方式,使用bufferUntil(ch)可以在遇到某个指定字符时才完成缓存。

    程序实例:

     

//Processing Code
import processing.serial.*;
 
Serial myPort;
 
void setup(){
 myPort = new Serial(this,"/dev/ttyACM0", 115200);  //in fact, any rate is ok...
 myPort.bufferUntil('\n'); //buffer until meet '\n', then call the event listener
}
 
void draw(){
 
}
 
//listen to the event. when buffer filled,run this method
void serialEvent(Serial p) {
 String inString = p.readString();
 print(inString);
}
 
//then the buffer will reveive all thebytes
//Arduino Code
int data=12345;
void setup()
{
 Serial.begin(115200);//rate
}
void loop()
{
 Serial.println(data); //send data, end up with '\n'
 delay(1000);
}

    当然,这种方法也可以用在普通的串口通信中,不必使用SerialEvent。接收的数据不直接使用,而是作为缓存。若未遇到结束标记,就继续读取下一次。当遇到结束标记,即完成缓存。

    程序实例:

    

//Processing Code
import processing.serial.*;
 
String message;
String temp;
Serial myPort;
 
void setup(){
 myPort = new Serial(this,"/dev/ttyACM0", 115200); //Set SerialPort
}
 
void draw(){
 if(myPort.available()>0){
   temp = myPort.readString(); //temp for read bytes
   for(int i = 0; i < temp.length(); i++){
     //if meet the end mark
     if(temp.charAt(i) == '\n'){
       println(message);
       message = "";  //cleanstring
     }
     else
       message += temp.charAt(i); //store byte
    }
  }
}
//Arduino Code
int data=12345;
void setup()
{
 Serial.begin(115200);//rate
}
void loop()
{
 Serial.println(data); //send data, end up with '\n'
 delay(1000);
}
 

2018-03-23 21:36:33 LiCM_CU 阅读数 810
  • 少儿编程:Scratch中的Arduino开发

    本门课程将介绍如何以Scratch的编程方式进行Arduino开发(需购买硬件,详情可以参考教程内容)。 课程包含16个小模块的调用,并以案例形式发散思维,对应生活中随处可见的场景。(如红绿灯、楼道声控开灯,火焰报警、电动车碰撞报警、触摸传感器开启灯/风扇、高温开启风扇、天黑打开路灯,厕所冲水设备等) 每节正式课程包含连接硬件和代码编写两个环节,如果是孩子学习,请家长做好监督看护工作。 我相信,编程对孩子的思维培养和好奇心的激发是确实存在益处的,希望每一个观众能够有所收获。 课程适合人群:对编程感兴趣的青少年;有意培养子女编程兴趣的家长;有意从事少儿编程相关工作的朋友。

    1470 人正在学习 去看看 王全

本例基于Arduino Uno

使用器件:ESP8266,LM35,LCD1602,IR LED,红外接收器

出现问题:

    1. ESP8266连接网络较慢;

    2.arduino在115200波特率下串口通信乱码异常严重(已解决);

    3.LM35模拟信号容易受到干扰;

应注意问题:

    1.如果对LM35进行输入检查那么容错率大有改善;

    2.ESP8266连接网络应该给出较大delay(),给其充足时间反应;

    3.Arduino的C++库不完整,请自行解决;

    4.本人代码没有封装,可能读起来比较困难

#include <LiquidCrystal.h>

#include "SoftwareSerial.h"
#include "stdlib.h"
#include <IRremote.h>  

int reading;
String val1;
String cmd;
int ReadTemp;
char OutTemp[10];

int count = 0;
int foundon;
int foundoff;

const String host = "http://wechatmaster.cn";
const String url = "/temp";

SoftwareSerial mySerial(12,13);//Set Soft Serial.  12: RX  13: TX

IRrecv irrecv(8);  
decode_results results;  
IRsend irsend;       
LiquidCrystal lcd(11, 10, 7, 6, 5, 4);

void ReadSerialInfor()
{
  val1 = "";
  while(mySerial.available())
  {
    val1+=char(mySerial.read());
    delay(5);
  }
  Serial.println(val1);
}


int SendTemperature(int temp)
{
  if (temp>=0&&temp<10)
  {  
    mySerial.println("AT+CIPSEND=5");
    delay(100);
    mySerial.print("LM35");
    mySerial.println(itoa(temp,OutTemp,10));
    delay(100);
    Serial.println("sent");
    return 0;
  } 

  else if ((temp>=10&&temp<100)||(temp<0&&temp>-10))
  {  
    mySerial.println("AT+CIPSEND=6");
    delay(100);
    mySerial.print("LM35");
    mySerial.println(itoa(temp,OutTemp,10));
    delay(100);
    Serial.println("sent");
    return 0;
  }

  else if (temp>=100||temp<=-10)
  {  
    mySerial.println("AT+CIPSEND=7");
    delay(100);
    mySerial.print("LM35");
    mySerial.println(itoa(temp,OutTemp,10));
    delay(100);
    Serial.println("sent");
    return 0;
  }

}


void LcdPrint(int Temp)
{
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Temperature:");
  lcd.print(itoa(Temp,OutTemp,10));
  lcd.setCursor(0, 1);
  lcd.print("Condition:");
  if((foundon == 1)&&(foundoff == 0)) lcd.print("ON");
  else if((foundoff == 1)&&(foundon == 0)) lcd.print("OFF");
  else lcd.print("NOCMD");
}


void GetCmd()
{
  cmd = "";
  while(mySerial.available())
  {
    cmd+= char(mySerial.read());
    delay(10);
  }
  Serial.println(cmd);
}

int FindONString(String Str)
{
  int i;
  for(i=0;i<Str.length()-1;i++)
  {
    if(Str[i]=='O')
    {
        if(Str[i+1]=='N')
        {
          Serial.println("control signal received");
          foundoff = 0;
          return 1; 
        }
    }
  }
  return 0;
}

int FindOFFString(String Str)
{
  int i;
  for(i=0;i<Str.length()-1;i++)
  {
    if(Str[i]=='O')
    {
        if(Str[i+1]=='F')
        {
          if(Str[i+1]=='F')
          {
            Serial.println("control signal received");
            foundon = 0;
            return 1; 
          }
        }
           
    }
  }
  return 0;
}
void GetIrrecvSignal()
{
  if (irrecv.decode(&results)) 
  { 
    Serial.println(results.value);  
    //CoolSignal = results.value;
    irrecv.resume(); 
    delay(100);
  }
}

void ReadTemperature()
{
  reading = analogRead(A0);
  ReadTemp = reading * 0.0048828125*100-55;
  Serial.print(F("Real Time Temp: ")); 
  Serial.println(ReadTemp);
}

void SerialOutput()
{
  Serial.print("waiting initialization");
  while((!Serial)&&(!mySerial))
  {
    Serial.print(".");
  }
}



void setup() {
  // put your setup code here, to run once:

  Serial.begin(9600);
  mySerial.begin(115200);
  Wifisetup();    
  irrecv.enableIRIn();  
  lcd.begin(16, 2);
  foundon = 0;
  foundoff = 0;
}

void loop() {
  // put your main code here, to run repeatedly:
  ReadTemperature();
  if(CheckTemp())
  {
    SendTemperature(ReadTemp);
    GetCmd();
    foundon = FindONString(cmd);
    foundoff = FindOFFString(cmd);
    LcdPrint(ReadTemp);
    SendIRSignal();
  }
  delay(600);
  //GetIrrecvSignal();
}

*服务器端和用户端由另外的同学负责,不要问我要代码;

*如果有余力应当将TCP传输改为http传输,ESP8266可以模拟http协议;

*因为隐私问题(路由器密码是我的名字。。。),WiFiSetup()函数没有给出;


欢迎交流相关经验

Arduino的时间库

阅读数 5769

没有更多推荐了,返回首页