深夜牢骚:

=。=由于看了一些错误的文档,导致烧写一直chip sync error,以致折腾至深夜,在烧洗澡水的同时,仅以此贴献给那些在苦逼调模块的童鞋们。

同时也希望机智云官方完善开发生态,让更多的人更快入门。

教程开始

1、准备工作
      
硬件部分:
      USB转TTL... (阅读全文)
深夜牢骚:

=。=由于看了一些错误的文档,导致烧写一直chip sync error,以致折腾至深夜,在烧洗澡水的同时,仅以此贴献给那些在苦逼调模块的童鞋们。

同时也希望机智云官方完善开发生态,让更多的人更快入门。

教程开始

1、准备工作
      
硬件部分:
      USB转TTL板(ch340,PL2302皆可)   *1
      ESP8266-01模块                                *1
      杜邦线(母对母)                               *6

软件部分:
      装好TTL板驱动的电脑一台
      乐鑫官方烧写软件
      机智云固件


2、硬件连线

     ESP8266管脚分布图如下:
      
     其管脚的主要功能如图:

      
     
     由图我们可以知道,ESP8266有正常工作模式与烧写模式之分,控制其模式的方法为控制模块管脚为不同的电平。
     
     烧写模式连线:
      1- GND    ---  TTL板GND
     3- GPIO0  ---  TTL板GND
     4- RXD     ---  TTL板TXD
     5- VCC      ---  TTL板VCC3.3V(必须为3.3V,接5V必烧)
     7- CH_PD ---  TTL板VCC3.3V(必须为3.3V,接5V必烧)
     8- TXD     ---   TTL板RXD

      注:这里的7脚最好使用一个104欧姆的上拉电阻


3、软件设置

      下载解压固件,并按照图内设置好,这是分段的固件,也可以下载合成的固件,分段固件务必设置好ADDR,否则固件不能工作,合成固件直接从0x00000开始即可,其他参数不变(参数适用于最新固件)

       将连接好模块的TTL板插入电脑USB口,在烧写软件里设置好COM口,点击烧写即可。

         

       烧写完成之后想要让模块正常工作,请拔掉与GPIO0相连的杜邦线,其他不变!

      打开调试助手,即可看到模块正常工作了。

         搜狗截图16年04月28日0047_2.png (177.68 KB, 下载次数: 3)

下载附件

2016-4-28 01:28 上传

      到此教程结束,=.=水好了,去洗澡,有关固件在压缩包里。

      发帖不易,你的回复是我发帖的动力

         固件.zip (235.75 KB, 下载次数: 317) 

      烧写工具下载地址:http://espressif.com/en/produc ... urces
话题: ESP8266

NodeMCU Pinmap 引脚对应ESP8266图

Simon • 4677 次浏览 • 来自相关话题

 
NodeMCU-Pin-Map.png

 
话题: ESP12E Nodemcu

Nodemcu+Blynk 通过WiFi控制开关求助

苏少爷 回复了问题 • 3 人关注 • 2 个回复 • 来自相关话题

ESP8266 ESP12 是否必须要更新固件才能开始调试?

苏少爷 回复了问题 • 2 人关注 • 1 个回复 • 来自相关话题

话题: ESP12E ESP8266

ESP8266-1 WiFi模块 型号1 引脚介绍

Tron • 1810 次浏览 • 来自相关话题

本人从站长Simon那里学到了不少关于Arduino的 WiFi 通信方面的知识,他发的教程也是很直观细致,就连我这种小白也能照着一步一步做出点东西来,在他的鼓励下,我也来写一点自己的心得。暂时还是处于小白教程阶段,希望高手勿喷。
 
因为ESP8266-12E的连接口太小,需要焊接才能接到面包板上... (阅读全文)
本人从站长Simon那里学到了不少关于Arduino的 WiFi 通信方面的知识,他发的教程也是很直观细致,就连我这种小白也能照着一步一步做出点东西来,在他的鼓励下,我也来写一点自己的心得。暂时还是处于小白教程阶段,希望高手勿喷。
 
因为ESP8266-12E的连接口太小,需要焊接才能接到面包板上,所以最近买了一个ESP8266型号1,虽然也不能直接插到面包板,但是可以用公母跳线来连接,对于测试使用还是非常方便的。下面是ESP-1的引脚介绍:
esp8266-1.png

如图,虽然只有两个可用的GPIO,但是对于基本的测试是完全可以胜任的。
 
ESP-1直连CP2102图示
ESP1-CP2102.png

ESP-1连Arduino Uno图示
ESP1-UNO.png


正在测试AP模式和STA模式的切换,测试完了会补充上来。
 
第一次发帖,希望大家支持!
话题: ESP8266 wifi

USB转TTL驱动及文件下载

Simon • 862 次浏览 • 来自相关话题

收集了一下主流USB转TTL转接器的驱动程序,不定时更新,希望大家有需要的可以在下面留言,会及时补上。
 
USB-TTL转接器一般的连接方法都是两个模块的RX(receive)与TX(transmit)互连,也就是一边发送另一边接受,GND接地,当然供电不足的可以用其他设备给要连接的板子供电。实际... (阅读全文)
收集了一下主流USB转TTL转接器的驱动程序,不定时更新,希望大家有需要的可以在下面留言,会及时补上。
 
USB-TTL转接器一般的连接方法都是两个模块的RX(receive)与TX(transmit)互连,也就是一边发送另一边接受,GND接地,当然供电不足的可以用其他设备给要连接的板子供电。实际连接根据板子不同如DTR等,需作调整。
 
CH340G
驱动下载:http://www.wch.cn/download/CH341SER_EXE.html
 
CP210X
驱动下载:https://www.silabs.com/products/mcu/Pages/USBtoUARTBridgeVCPDrivers.aspx
 
 
话题: CH340G CP2102

DHT11 温度湿度传感器使用教程

Simon • 961 次浏览 • 来自相关话题

DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个8位单片机相连接。温湿度传感器的应用也非常广泛,在室内温度控制、气象监测等领域都有广泛的应用。
实例:可以配合加湿器或除湿器快速搭建一个室内湿度自动调节系统。
[att... (阅读全文)
DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个8位单片机相连接。温湿度传感器的应用也非常广泛,在室内温度控制、气象监测等领域都有广泛的应用。
实例:可以配合加湿器或除湿器快速搭建一个室内湿度自动调节系统。
DHT11.jpg

传感器属性:
工作电压:3.5 - 5.5 VDC 
湿度范围:20-90%RH (±5%RH)
温度范围:0-50℃ (±2℃)
 
电路连接:(正面从左至右为Pin1-4,Pin2连两次)
Pin1->  5V
Pin2 -> D4
Pin2 -> 串联5k电阻
Pin3 -> 悬空
Pin4 -> GND
Arduino-and-DHT11.jpg

DHT11 Library 下载:(DHT11、DHT21、DHT22均可使用)
DHT通用库:
Arudino代码:(下载DHT通用库的直接 文件 -> 示例 -> DHT sensor library -> DHTtester)
// 各型号DHT温湿度传感器测试脚本
//
面包社区 http://mianbao.space/topic/DHT11
// Written by ladyada, Chinese comments by Simon from Mianbao.space.


#include "DHT.h" // 获取DHT通用库

#define DHTPIN 4 // 定义DHT Data Pin所接的GPIO

// 取消对应的温湿度传感器前的注释,默认DHT11
#define DHTTYPE DHT11 // DHT 11
//#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
//#define DHTTYPE DHT21 // DHT 21 (AM2301)

// 连接 pin 1 (最左侧)到 +5V
// (注意: 如果使用3.3V 逻辑电路,则把 pin 1 连到 3.3V)
// 连接 pin 2 到开发板获取数据引脚,也就是上面定义的 DHTPIN
// pin 3 悬空不连接
// 连接 pin 4 到 GND
// 在5V和 pin 2 之间连接一个 10K 电阻

// Initialize DHT sensor.
// Note that older versions of this library took an optional third parameter to
// tweak the timings for faster processors. This parameter is no longer needed
// as the current DHT reading algorithm adjusts itself to work on faster procs.
DHT dht(DHTPIN, DHTTYPE);

void setup() {
Serial.begin(9600);
Serial.println("DHT test!");

dht.begin();
}

void loop() {
// Wait a few seconds between measurements.
delay(2000);

// Reading temperature or humidity takes about 250 milliseconds!
// Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
float h = dht.readHumidity();
// Read temperature as Celsius (the default)
float t = dht.readTemperature();
// Read temperature as Fahrenheit (isFahrenheit = true)
float f = dht.readTemperature(true);

// Check if any reads failed and exit early (to try again).
if (isnan(h) || isnan(t) || isnan(f)) {
Serial.println("Failed to read from DHT sensor!");
return;
}

// Compute heat index in Fahrenheit (the default)
float hif = dht.computeHeatIndex(f, h);
// Compute heat index in Celsius (isFahreheit = false)
float hic = dht.computeHeatIndex(t, h, false);

Serial.print("Humidity: ");
Serial.print(h);
Serial.print(" %\t");
Serial.print("Temperature: ");
Serial.print(t);
Serial.print(" *C ");
Serial.print(f);
Serial.print(" *F\t");
Serial.print("Heat index: ");
Serial.print(hic);
Serial.print(" *C ");
Serial.print(hif);
Serial.println(" *F");
}
其他注意事项:
手动焊接,在最高260℃的温度条件下接触时间须少于10秒。
长期保存条件:温度10-40℃,湿度60%以下。
 
相关文档:DHT11数字温湿度传感器-制造商中文文档.pdf
 

433Mhz RF 无线电收发模块使用教程

Simon • 1276 次浏览 • 来自相关话题

本文为面包社区原创内容,未经作者及本站允许请勿转载至任何其他平台!
 
433Mhz无线电收发模块是非常便宜而且是最简单的无线收发装置,你可以把它想象成一根虚拟的导线,可以传递信号。相比于蓝牙和WiFi收发装置(如[url=http://mianbao.space/topic/ESP8... (阅读全文)
本文为面包社区原创内容,未经作者及本站允许请勿转载至任何其他平台!
 
433Mhz无线电收发模块是非常便宜而且是最简单的无线收发装置,你可以把它想象成一根虚拟的导线,可以传递信号。相比于蓝牙和WiFi收发装置(如ESP8266)相比,433Mhz无线电收发模块,如上图,是由两个模块组成的,分别是发射器(Transmitter)和接收器(Receiver),它只能单向发送信号。但是它的优点就是相比于蓝牙而言,发射的距离非常远,且穿墙能力也很好;相比于WiFi模块相比,它更加省电和高效。因此无线电收发非常适合单向的信息传送以及对耗能有要求的设备,比如设备使用电池当做电源,那么WiFi可能让你的设备用不到一天就能把电池耗尽。
rf_pair-500x500.JPG

Library库:
VirtualWire库下载:
 
电路连接:上图左边是发射器(Transmitter),右边是接收器(Receiver);两个板上各有一个孔可以连接天线,在发射器上有标出“ANT”。
 
发射器:
DATA -> D12
VCC -> 5V
GND -> GND
 
接收器:
GND -> GND
DATA(中间两个都是DATA,完全相同) -> D12
VCC -> 5V
 
Arduino 代码:
发射器(Transmitter)
// transmitter.pde
//
// Simple example of how to use VirtualWire to transmit messages
// Implements a simplex (one-way) transmitter with an TX-C1 module
//
// See VirtualWire.h for detailed API docs
// Author: Mike McCauley (mikem@airspayce.com)
// Copyright (C) 2008 Mike McCauley
// $Id: transmitter.pde,v 1.3 2009/03/30 00:07:24 mikem Exp $

#include <VirtualWire.h>

void setup()
{
Serial.begin(9600); // Debugging only
Serial.println("setup"); // Prints "Setup to the serial monitor"

vw_set_tx_pin(12); // Sets pin D12 as the TX pin
vw_set_ptt_inverted(true); // Required for DR3100
vw_setup(4000); // Bits per sec
}

void loop()
{
const char *msg = "hello"; // Message to be sent
digitalWrite(13, true); // Flash a light to show transmitting
vw_send((uint8_t *)msg, strlen(msg)); //Sending the message
vw_wait_tx(); // Wait until the whole message is gone
digitalWrite(13, false); // Turn the LED off.
delay(50); // A short gap.
}

接收器(Receiver)
// receiver.pde
//
// Simple example of how to use VirtualWire to receive messages
// Implements a simplex (one-way) receiver with an Rx-B1 module
//
// See VirtualWire.h for detailed API docs
// Author: Mike McCauley (mikem@airspayce.com)
// Copyright (C) 2008 Mike McCauley
// $Id: receiver.pde,v 1.3 2009/03/30 00:07:24 mikem Exp $

#include <VirtualWire.h>
int count;
void setup()
{
Serial.begin(9600); // Debugging only
Serial.println("setup"); //Prints "Setup" to the serial monitor
vw_set_rx_pin(12); //Sets pin D12 as the RX Pin
vw_set_ptt_inverted(true); // Required for DR3100
vw_setup(4000); // Bits per sec
vw_rx_start(); // Start the receiver PLL running
}

void loop()
{
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;
if (vw_get_message(buf, &buflen)) // Non-blocking
{
int i;
digitalWrite(13, true); // Flash a light to show received good message
// Message with a good checksum received, dump it.
Serial.print("Got: ");

for (i = 0; i < buflen; i++)
{
char c = (buf[i]);
Serial.print(c);
Serial.print(" ");
}
count++;
// Serial.print(count);
Serial.println("");
digitalWrite(13, false);
}
}[/i]

 
话题: 无线电 教程

ESP8266 ESP-12E 连接电脑教程

Simon • 1248 次浏览 • 来自相关话题

本文为面包社区原创内容,未经作者及本站允许请勿转载至任何其他平台!
 
ESP8266的第12个版本ESP12E是现在主流使用的WiFi模块,最方便的方法就是购买一块 Nodemcu 开发板,可... (阅读全文)
本文为面包社区原创内容,未经作者及本站允许请勿转载至任何其他平台!
 
ESP8266的第12个版本ESP12E是现在主流使用的WiFi模块,最方便的方法就是购买一块 Nodemcu 开发板,可以直接使用Micro USB连接电脑来编程,但是如果没有购买Nodemcu或者想要利用ESP12E体积小巧的有点的话,要如何连接电脑呢?
 
ESP8266的优点是芯片自带了闪存,最新版的闪存达到了4M之大,因此我们可以完全把ESP8266当做开发板来编程使用。这个教程将介绍如何将ESP12E通过USB to Serial 转换器连接到电脑,直接使用 Arduino IDE 或其他 IDE上传代码到 ESP12E上执行。
IMG_7232.jpg

硬件准备:
ESP12E 1个
  • ESP12E的引脚间距是2.0mm,因此不能使用插入标准的2.5mm的面包板里,所以我们需要直接焊接一些跳线到ESP12-E上,或者你也可以购买一个ESP12串口转换板来方便连接,如上图白色PCB板。

USB to Sertial 转换器 1个
  • 如CP2102,CH340G,FTDI均可,不支持3.3V的转换器需要一个稳压器/电压调节器

跳线 1堆
CP2102.jpg

上图为CP2102 USB2TTL转换器
 
电路连接:(点击图片可以看大图)
ESP12E_WIRE2.jpg

如果手头的USB2TTL转换器支持3.3V电压输出,可以忽略上图最上面稳压器的部分,直接把红色线连接到3.3V电压。注意ESP12的引脚和Nodemcu是不一样的。
VCC → 3.3V
CH_PD(EN) -> 3.3V
GPIO2 -> 3.3V
GND -> GND
GPIO15 -> GND
GPIO0 -> GND(如果使用AT模式则GPIO0连接到3.3V,这里为了编程必须将GPIO0连接到GND)
 
转换器交互连接:
这里是CP2102和ESP12E的连接方法,很简单:(基本就是RX和TX反连,再接入GND,供电不足可以用Uno供应3.3V电压)
CP2102 <--------> ESP-12
 Rx  <--------> Tx
 Tx  <--------> Rx
 GND <--------> GND
 
我在使用的是USB3.0的接口,所以电量比较充足,如果你发现连接都正确但是没法上传代码的话,可以尝试通过Arduino Uno来提供3.3V的电压给ESP12E。
 
IDE操作:
连接正确之后需要在Arduino IDE中的“Board Manager”中搜索“ESP8266”并安装ESP8266板,然后就可以直接给ESP12E上传代码啦,注意选择对应的串口和板,一般可以直接选择“Generic ESP8266”。注意打开串口监视器,可以的查看ESP12E反馈的信息。
 
ESP8266默认使用AT Command语言进行通信,基本的一些通信语言如下,更多指令可以自行搜索一下或者发帖求助。
 
首先ESP8266通电之后将会自动运行开放AP广播模式,这个时候用电脑搜索ESP8266生成的AP并连接,如“AP-THINKER_FT5F93”,连接完成之后就可以在Arduino IDE的串口监视器内输入下面的AT质量对ESP8266进行控制了。
AT+CWMODE=1 (从AP模式转换到STA模式)
OK

AT+CWLAP (列出可连接的网络,需要先用 CWMODE指令转换为STA模式才能搜寻可加入的网络,否则会出现error)
+CWLAP:(3,”mianbao”,-68,”f8:35:dd:75:12:1b”,1)
+CWLAP:(0,”mianbao_guest”,-69,”fa:35:dd:75:12:1c”,1)
+CWLAP:(2,”TP-Link391”,-92,”00:18:e7:e7:1d:2c”,2)
OK

AT+CWJAP=”mianbao_guest”,”” (连接mianbao_guest网络,如果连接有密码的网络,第二组引号内填入密码)
OK

AT+CWJAP? (询问当前连接的网络)
+CWJAP:”mianbao_guest”
OK

AT+CIFSR=?
OK

AT+CIFSR
+CIFSR:STAIP,”192.168.1.43″
+CIFSR:STAMAC,”18:fe:34:fe:2b:43″
OK

AT+CIPSTART=”TCP”,”root.mianbao.space”,80
CONNECT
OK
本文为面包社区原创内容,未经作者及本站允许请勿转载至任何其他平台!
 
超声波测距仪(Ultrasonic Sensor)是一个非常廉价但是精确度很高使用也非常方便的传感器,用途也非常广泛,这篇教程将简单介绍一下HC-SR04的使用方法,其他型号使用基本相同。
[atta... (阅读全文)
本文为面包社区原创内容,未经作者及本站允许请勿转载至任何其他平台!
 
超声波测距仪(Ultrasonic Sensor)是一个非常廉价但是精确度很高使用也非常方便的传感器,用途也非常广泛,这篇教程将简单介绍一下HC-SR04的使用方法,其他型号使用基本相同。
HCSR04.jpg

传感器属性:
工作电压:DC 5V 
工作电流:15mA 
测距范围:2CM-400CM(低于2厘米会失去精度)
测量角度:15度
 
电路连接:(其他型号若不是Trig和Echo,则根据发送和接收来连接即可)
VCC -> 5V
GND -> GND
Trig -> D3 (Trig 发送声波)
Echo -> D2 (Echo 接收声波)
 
Arduino 代码:
/*
Name: Ultrasonic Sensor
Owner: Simon @ 面包社区(http://mianbao.space
Update: 2015-12-21
*/

//定义Pin
#define trigPin 3
#define echoPin 2

void setup() {
Serial.begin(9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
}

void loop() {

float duration, distance;//定义2个变量
digitalWrite(trigPin, HIGH); // Trig发送声波
delayMicroseconds(1000);
digitalWrite(trigPin, LOW); //Trig发送声波结束

duration = pulseIn(echoPin, HIGH); //使用pulseIn函数测量接收时间
distance = (duration / 2.0)/ 29.1; //将接收时间转化为距离

Serial.print("Distance: "); //在串口监视器上打印测量的距离
Serial.print(distance);
Serial.println(" CM");
delay(500); //每500毫秒显示一次数据
}

 
本文为面包社区原创内容,未经作者及本站允许请勿转载至任何其他平台!






陀螺仪和加速度仪是定位的主要模块,通过陀螺仪和加速度仪就可以很好地获取物体运动及位置的相关数据,配合磁力计和气压计、GPS等模块可以组成更加精确定位的部件。
MUP-6050... (阅读全文)
本文为面包社区原创内容,未经作者及本站允许请勿转载至任何其他平台!

mianbao.space-mpu-6050_.png


陀螺仪和加速度仪是定位的主要模块,通过陀螺仪和加速度仪就可以很好地获取物体运动及位置的相关数据,配合磁力计和气压计、GPS等模块可以组成更加精确定位的部件。
MUP-6050 breakout 板使用 InvenSense MPU-6050 6轴(3+3)芯片,使用I2C连接,使用非常方便。
 
InvenSense MPU-6050官方数据:
http://www.invensense.com/products/motion-tracking/6-axis/
http://www.invensense.com/products/motion-tracking/6-axis/mpu-6050/
 
本教程以在Arduino IDE 串口监视器中获取基本的三轴数据为目的,不使用Processing等软件。
 
电路连接:(有两个Analog Pin的设备均可)
Untitled_Sketch_bb.png

VCC -> 3.3V
GND -> GND
SCL -> A5
SDA -> A4
XDA -> 留空
XCL -> 留空
ADO -> GND
INT -> D2
 
Library 库:
直接在I2C的库里找到MPU-6050文件夹,复制到Arduino的 Library 文件夹下,重启 Arduino IDE就可以使用
(如之前没有使用过I2C,需要把I2Cdev也一并复制过去)
 
Arduino 代码:
打开IDE,选择“文件” -> “示例” -> “MPU6050” -> “Examples” -> “MPU6050_DMP6”
或者直接拷贝下面的代码到IDE里:
// I2Cdev and MPU6050 must be installed as libraries, or else the .cpp/.h files
// for both classes must be in the include path of your project
#include "I2Cdev.h"

#include "MPU6050_6Axis_MotionApps20.h"
//#include "MPU6050.h" // not necessary if using MotionApps include file

// Arduino Wire library is required if I2Cdev I2CDEV_ARDUINO_WIRE implementation
// is used in I2Cdev.h
#if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE
#include "Wire.h"
#endif

// class default I2C address is 0x68
// specific I2C addresses may be passed as a parameter here
// AD0 low = 0x68 (default for SparkFun breakout and InvenSense evaluation board)
// AD0 high = 0x69
MPU6050 mpu;
//MPU6050 mpu(0x69); // <-- use for AD0 high

/* =========================================================================
NOTE: In addition to connection 3.3v, GND, SDA, and SCL, this sketch
depends on the MPU-6050's INT pin being connected to the Arduino's
external interrupt #0 pin. On the Arduino Uno and Mega 2560, this is
digital I/O pin 2.
* ========================================================================= */

/* =========================================================================
NOTE: Arduino v1.0.1 with the Leonardo board generates a compile error
when using Serial.write(buf, len). The Teapot output uses this method.
The solution requires a modification to the Arduino USBAPI.h file, which
is fortunately simple, but annoying. This will be fixed in the next IDE
release. For more info, see these links:

http://arduino.cc/forum/index.php/topic,109987.0.html
http://code.google.com/p/ardui ... 3D958
* ========================================================================= */



// uncomment "OUTPUT_READABLE_QUATERNION" if you want to see the actual
// quaternion components in a [w, x, y, z] format (not best for parsing
// on a remote host such as Processing or something though)
//#define OUTPUT_READABLE_QUATERNION

// uncomment "OUTPUT_READABLE_EULER" if you want to see Euler angles
// (in degrees) calculated from the quaternions coming from the FIFO.
// Note that Euler angles suffer from gimbal lock (for more info, see
// http://en.wikipedia.org/wiki/Gimbal_lock)
//#define OUTPUT_READABLE_EULER

// uncomment "OUTPUT_READABLE_YAWPITCHROLL" if you want to see the yaw/
// pitch/roll angles (in degrees) calculated from the quaternions coming
// from the FIFO. Note this also requires gravity vector calculations.
// Also note that yaw/pitch/roll angles suffer from gimbal lock (for
// more info, see: http://en.wikipedia.org/wiki/Gimbal_lock)
#define OUTPUT_READABLE_YAWPITCHROLL

// uncomment "OUTPUT_READABLE_REALACCEL" if you want to see acceleration
// components with gravity removed. This acceleration reference frame is
// not compensated for orientation, so +X is always +X according to the
// sensor, just without the effects of gravity. If you want acceleration
// compensated for orientation, us OUTPUT_READABLE_WORLDACCEL instead.
//#define OUTPUT_READABLE_REALACCEL

// uncomment "OUTPUT_READABLE_WORLDACCEL" if you want to see acceleration
// components with gravity removed and adjusted for the world frame of
// reference (yaw is relative to initial orientation, since no magnetometer
// is present in this case). Could be quite handy in some cases.
//#define OUTPUT_READABLE_WORLDACCEL

// uncomment "OUTPUT_TEAPOT" if you want output that matches the
// format used for the InvenSense teapot demo
//#define OUTPUT_TEAPOT



#define LED_PIN 13 // (Arduino is 13, Teensy is 11, Teensy++ is 6)
bool blinkState = false;

// MPU control/status vars
bool dmpReady = false; // set true if DMP init was successful
uint8_t mpuIntStatus; // holds actual interrupt status byte from MPU
uint8_t devStatus; // return status after each device operation (0 = success, !0 = error)
uint16_t packetSize; // expected DMP packet size (default is 42 bytes)
uint16_t fifoCount; // count of all bytes currently in FIFO
uint8_t fifoBuffer[64]; // FIFO storage buffer

// orientation/motion vars
Quaternion q; // [w, x, y, z] quaternion container
VectorInt16 aa; // [x, y, z] accel sensor measurements
VectorInt16 aaReal; // [x, y, z] gravity-free accel sensor measurements
VectorInt16 aaWorld; // [x, y, z] world-frame accel sensor measurements
VectorFloat gravity; // [x, y, z] gravity vector
float euler[3]; // [psi, theta, phi] Euler angle container
float ypr[3]; // [yaw, pitch, roll] yaw/pitch/roll container and gravity vector

// packet structure for InvenSense teapot demo
uint8_t teapotPacket[14] = { '$', 0x02, 0,0, 0,0, 0,0, 0,0, 0x00, 0x00, '\r', '\n' };



// ================================================================
// === INTERRUPT DETECTION ROUTINE ===
// ================================================================

volatile bool mpuInterrupt = false; // indicates whether MPU interrupt pin has gone high
void dmpDataReady() {
mpuInterrupt = true;
}



// ================================================================
// === INITIAL SETUP ===
// ================================================================

void setup() {
// join I2C bus (I2Cdev library doesn't do this automatically)
#if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE
Wire.begin();
TWBR = 24; // 400kHz I2C clock (200kHz if CPU is 8MHz). Comment this line if having compilation difficulties with TWBR.
#elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE
Fastwire::setup(400, true);
#endif

// initialize serial communication
// (115200 chosen because it is required for Teapot Demo output, but it's
// really up to you depending on your project)
Serial.begin(115200);
while (!Serial); // wait for Leonardo enumeration, others continue immediately

// NOTE: 8MHz or slower host processors, like the Teensy @ 3.3v or Ardunio
// Pro Mini running at 3.3v, cannot handle this baud rate reliably due to
// the baud timing being too misaligned with processor ticks. You must use
// 38400 or slower in these cases, or use some kind of external separate
// crystal solution for the UART timer.

// initialize device
Serial.println(F("Initializing I2C devices..."));
mpu.initialize();

// verify connection
Serial.println(F("Testing device connections..."));
Serial.println(mpu.testConnection() ? F("MPU6050 connection successful") : F("MPU6050 connection failed"));

// wait for ready
Serial.println(F("\nSend any character to begin DMP programming and demo: "));
while (Serial.available() && Serial.read()); // empty buffer
while (!Serial.available()); // wait for data
while (Serial.available() && Serial.read()); // empty buffer again

// load and configure the DMP
Serial.println(F("Initializing DMP..."));
devStatus = mpu.dmpInitialize();

// supply your own gyro offsets here, scaled for min sensitivity
mpu.setXGyroOffset(220);
mpu.setYGyroOffset(76);
mpu.setZGyroOffset(-85);
mpu.setZAccelOffset(1788); // 1688 factory default for my test chip

// make sure it worked (returns 0 if so)
if (devStatus == 0) {
// turn on the DMP, now that it's ready
Serial.println(F("Enabling DMP..."));
mpu.setDMPEnabled(true);

// enable Arduino interrupt detection
Serial.println(F("Enabling interrupt detection (Arduino external interrupt 0)..."));
attachInterrupt(0, dmpDataReady, RISING);
mpuIntStatus = mpu.getIntStatus();

// set our DMP Ready flag so the main loop() function knows it's okay to use it
Serial.println(F("DMP ready! Waiting for first interrupt..."));
dmpReady = true;

// get expected DMP packet size for later comparison
packetSize = mpu.dmpGetFIFOPacketSize();
} else {
// ERROR!
// 1 = initial memory load failed
// 2 = DMP configuration updates failed
// (if it's going to break, usually the code will be 1)
Serial.print(F("DMP Initialization failed (code "));
Serial.print(devStatus);
Serial.println(F(")"));
}

// configure LED for output
pinMode(LED_PIN, OUTPUT);
}



// ================================================================
// === MAIN PROGRAM LOOP ===
// ================================================================

void loop() {
// if programming failed, don't try to do anything
if (!dmpReady) return;

// wait for MPU interrupt or extra packet(s) available
while (!mpuInterrupt && fifoCount < packetSize) {
// other program behavior stuff here
// .
// .
// .
// if you are really paranoid you can frequently test in between other
// stuff to see if mpuInterrupt is true, and if so, "break;" from the
// while() loop to immediately process the MPU data
// .
// .
// .
}

// reset interrupt flag and get INT_STATUS byte
mpuInterrupt = false;
mpuIntStatus = mpu.getIntStatus();

// get current FIFO count
fifoCount = mpu.getFIFOCount();

// check for overflow (this should never happen unless our code is too inefficient)
if ((mpuIntStatus & 0x10) || fifoCount == 1024) {
// reset so we can continue cleanly
mpu.resetFIFO();
Serial.println(F("FIFO overflow!"));

// otherwise, check for DMP data ready interrupt (this should happen frequently)
} else if (mpuIntStatus & 0x02) {
// wait for correct available data length, should be a VERY short wait
while (fifoCount < packetSize) fifoCount = mpu.getFIFOCount();

// read a packet from FIFO
mpu.getFIFOBytes(fifoBuffer, packetSize);

// track FIFO count here in case there is > 1 packet available
// (this lets us immediately read more without waiting for an interrupt)
fifoCount -= packetSize;

#ifdef OUTPUT_READABLE_QUATERNION
// display quaternion values in easy matrix form: w x y z
mpu.dmpGetQuaternion(&q, fifoBuffer);
Serial.print("quat\t");
Serial.print(q.w);
Serial.print("\t");
Serial.print(q.x);
Serial.print("\t");
Serial.print(q.y);
Serial.print("\t");
Serial.println(q.z);
#endif

#ifdef OUTPUT_READABLE_EULER
// display Euler angles in degrees
mpu.dmpGetQuaternion(&q, fifoBuffer);
mpu.dmpGetEuler(euler, &q);
Serial.print("euler\t");
Serial.print(euler[0] * 180/M_PI);
Serial.print("\t");
Serial.print(euler[1] * 180/M_PI);
Serial.print("\t");
Serial.println(euler[2] * 180/M_PI);
#endif

#ifdef OUTPUT_READABLE_YAWPITCHROLL
// display Euler angles in degrees
mpu.dmpGetQuaternion(&q, fifoBuffer);
mpu.dmpGetGravity(&gravity, &q);
mpu.dmpGetYawPitchRoll(ypr, &q, &gravity);
Serial.print("ypr\t");
Serial.print(ypr[0] * 180/M_PI);
Serial.print("\t");
Serial.print(ypr[1] * 180/M_PI);
Serial.print("\t");
Serial.println(ypr[2] * 180/M_PI);
#endif

#ifdef OUTPUT_READABLE_REALACCEL
// display real acceleration, adjusted to remove gravity
mpu.dmpGetQuaternion(&q, fifoBuffer);
mpu.dmpGetAccel(&aa, fifoBuffer);
mpu.dmpGetGravity(&gravity, &q);
mpu.dmpGetLinearAccel(&aaReal, &aa, &gravity);
Serial.print("areal\t");
Serial.print(aaReal.x);
Serial.print("\t");
Serial.print(aaReal.y);
Serial.print("\t");
Serial.println(aaReal.z);
#endif

#ifdef OUTPUT_READABLE_WORLDACCEL
// display initial world-frame acceleration, adjusted to remove gravity
// and rotated based on known orientation from quaternion
mpu.dmpGetQuaternion(&q, fifoBuffer);
mpu.dmpGetAccel(&aa, fifoBuffer);
mpu.dmpGetGravity(&gravity, &q);
mpu.dmpGetLinearAccel(&aaReal, &aa, &gravity);
mpu.dmpGetLinearAccelInWorld(&aaWorld, &aaReal, &q);
Serial.print("aworld\t");
Serial.print(aaWorld.x);
Serial.print("\t");
Serial.print(aaWorld.y);
Serial.print("\t");
Serial.println(aaWorld.z);
#endif

#ifdef OUTPUT_TEAPOT
// display quaternion values in InvenSense Teapot demo format:
teapotPacket[2] = fifoBuffer[0];
teapotPacket[3] = fifoBuffer[1];
teapotPacket[4] = fifoBuffer[4];
teapotPacket[5] = fifoBuffer[5];
teapotPacket[6] = fifoBuffer[8];
teapotPacket[7] = fifoBuffer[9];
teapotPacket[8] = fifoBuffer[12];
teapotPacket[9] = fifoBuffer[13];
Serial.write(teapotPacket, 14);
teapotPacket[11]++; // packetCount, loops at 0xFF on purpose
#endif

// blink LED to indicate activity
blinkState = !blinkState;
digitalWrite(LED_PIN, blinkState);
}
}

打开串口监视器,出现以下代码:
Initializing I2C devices...
Testing device connections...
MPU6050 connection failed

Send any character to begin DMP programming and demo:
在串口监视器中输入任何字符,点发送后,开始获取数据。
本文为面包社区原创内容,未经作者及本站允许请勿转载至任何其他平台!





 
通过一个Joystick手柄组件和一个 Arduino Leonardo 或者 Pro Micro 来制作一个可以控制电脑鼠标,并点击的控制器。Joystick实际上是一个... (阅读全文)
本文为面包社区原创内容,未经作者及本站允许请勿转载至任何其他平台!

Joystick_Leonardo.jpg

 
通过一个Joystick手柄组件和一个 Arduino Leonardo 或者 Pro Micro 来制作一个可以控制电脑鼠标,并点击的控制器。Joystick实际上是一个变阻器,通过改变x、y轴的阻止来发送信号,经由IDE编译并刷新相对的x、y信号来控制鼠标指针移动。
 
延伸应用:街机项目、游戏操作项目、控制机器人移动等
所需部件:
Joystick Module 1个(没有的话也可以使用 Blynk 中的虚拟Joystick来实现)
Arduino Leonardo 或 Pro Micro 1个
arcade button 1个(充当鼠标左键,可以不使用)
一些 Jumper wires
 
电路连接:(仅限Leonardo/Micro/PRO Micro等支持MOUSE函数的设备)
Schematic.png

VCC -> 5V
GND -> GND
Y/VRy -> A0
X/VRx -> A1
KEY/SW -> D2
 
 
 
Arduino代码:
手柄输入的数据范围是0到1023,我们将通过把这个范围的值编译为-10到10来控制鼠标,如果你想要改变鼠标的移动速度,可以自行修改代码来实现。如果使用的是 Pro Micro,上传代码的时候也可以使用“Arduino Leonardo”板,或者自行下载 Pro Micro 板,并选择对应端口。
 
*使用时需要先按一下Joystick自带的按钮来开始操控。
// Define Pins

const int startEmulation = 2; // switch to turn on and off mouse emulation
const int mouseLeftButton = 4; // input pin for the mouse left Button
const int joystickX = A1; // joystick X axis
const int joystickY = A0; // joystick Y axis

// parameters for reading the joystick:
int cursorSpeed = 10; // output speed of X or Y movement
int responseDelay = 5; // response delay of the mouse, in ms
int threshold = cursorSpeed/4; // resting threshold
int center = cursorSpeed/2; // resting position value

boolean mouseIsActive = false; // whether or not to control the mouse
int lastSwitchState = LOW; // previous switch state

void setup() {
pinMode(startEmulation, INPUT_PULLUP); // the switch pin
pinMode(mouseLeftButton, INPUT_PULLUP); // the left mouse button pin

Mouse.begin(); // take control of the mouse
}

void loop() {
// read the switch:
int switchState = digitalRead(startEmulation);

// if it's changed and it's high, toggle the mouse state:
if (switchState != lastSwitchState) {
if (switchState == LOW) {
mouseIsActive = !mouseIsActive;
}
}

// save switch state for next loop:
lastSwitchState = switchState;

// read and scale the two axes:
int xReading = readAxis(A1);
int yReading = readAxis(A0);

// if the mouse control state is active, move the mouse:
if (mouseIsActive) {
Mouse.move(xReading, yReading, 0); // (x, y, scroll mouse wheel)
}

// read the mouse button and click or not click:
// if the mouse button is pressed:
if (digitalRead(mouseLeftButton) == HIGH) {
// if the mouse is not pressed, press it:
if (!Mouse.isPressed(MOUSE_LEFT)) {
Mouse.press(MOUSE_LEFT);
delay(100); // delay to enable single and double-click
}
}

// else the mouse button is not pressed:
else {
// if the mouse is pressed, release it:
if (Mouse.isPressed(MOUSE_LEFT)) {
Mouse.release(MOUSE_LEFT);
}
}

delay(responseDelay);
}

/*
reads an axis (0 or 1 for x or y) and scales the
analog input range to a range from 0 to <range>
*/

int readAxis(int thisAxis) {
// read the analog input:
int reading = analogRead(thisAxis);

// map the reading from the analog input range to the output range:
reading = map(reading, 0, 1023, 0, cursorSpeed);

// if the output reading is outside from the
// rest position threshold, use it:
int distance = reading - center;

if (abs(distance) < threshold) {
distance = 0;
}

// return the distance for this axis:
return distance;
}

0.96英寸 I2C 128x64 OLED显示屏连接教程

Simon • 771 次浏览 • 来自相关话题

本文为面包社区原创内容,未经作者及本站允许请勿转载至任何其他平台!
 本教程针对的是 4pin 的I2C单色的OLED 128x64显示屏,使用 u8glib 库,其他不同的显示屏可以根据情况做对应修改。

[attac... (阅读全文)
本文为面包社区原创内容,未经作者及本站允许请勿转载至任何其他平台!
 本教程针对的是 4pin 的I2C单色的OLED 128x64显示屏,使用 u8glib 库,其他不同的显示屏可以根据情况做对应修改。

128X64OLED_Mianbao.space_.jpg

 
I2C连接:
VIN -> 5V 或 3.3V
GND -> GND
SCL -> A5
SDA -> A4
 
Library 库:
这里使用u8glib的库,可以自行选择其他库使用。
https://bintray.com/olikraus/u8glib/Arduino,找到“Downloads”下载最新的库。
然后解压,把“U8glib”添加到 Arduino IDE “Library”文件夹下,重启 Arduino IDE
 
代码:
菜单栏: “文件” -> “示例” -> “U8glib”,选“GraphicsTest”或“Hello World”均可进行测试。
(*注意代码中需要取消对应显示屏型号前面的注释“//”才能使用)
 
找到以下代码,把最前面的“//”去掉
//U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE|U8G_I2C_OPT_DEV_0);	// I2C / TWI 

 
如果你的OLED和上面图上的一样是4个pin,而且是128x64分辨率,那么你可以直接复制下面的代码进行测试:
#include "U8glib.h"

U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE|U8G_I2C_OPT_DEV_0); // I2C / TWI

void draw(void) {
// graphic commands to redraw the complete screen should be placed here
u8g.setFont(u8g_font_unifont);
//u8g.setFont(u8g_font_osb21);
u8g.drawStr( 0, 22, " mianbao.space");
}

void setup(void) {
// flip screen, if required
// u8g.setRot180();

// set SPI backup if required
//u8g.setHardwareBackup(u8g_backup_avr_spi);

// assign default color value
if ( u8g.getMode() == U8G_MODE_R3G3B2 ) {
u8g.setColorIndex(255); // white
}
else if ( u8g.getMode() == U8G_MODE_GRAY2BIT ) {
u8g.setColorIndex(3); // max intensity
}
else if ( u8g.getMode() == U8G_MODE_BW ) {
u8g.setColorIndex(1); // pixel on
}
else if ( u8g.getMode() == U8G_MODE_HICOLOR ) {
u8g.setHiColorByRGB(255,255,255);
}
}

void loop(void) {
// picture loop
u8g.firstPage();
do {
draw();
} while( u8g.nextPage() );

// rebuild the picture after some delay
delay(50);
}

HMC5883L 三轴磁力计/电子指南针使用教程

Simon • 615 次浏览 • 来自相关话题

本文为面包社区原创内容,未经作者及本站允许请勿转载至任何其他平台!
 
磁力计和气压计、陀螺仪、GPS等模块主要用于定位,其中磁力计主要靠测量地球的磁场来确定指向。
一般购买的 HMC5883L 三轴磁力计有两种,一种是5孔只有5V没有3.3V的,另一种是6孔有5V也有3.3V的,但是... (阅读全文)
本文为面包社区原创内容,未经作者及本站允许请勿转载至任何其他平台!
 
磁力计和气压计、陀螺仪、GPS等模块主要用于定位,其中磁力计主要靠测量地球的磁场来确定指向。
一般购买的 HMC5883L 三轴磁力计有两种,一种是5孔只有5V没有3.3V的,另一种是6孔有5V也有3.3V的,但是由于板上自带有稳压器,所以使用5V都没有问题。使用I2C连接,使用非常简单。

HMC5883L_Minbao.space_.jpg


HMC5883L_chip.jpg

 
I2C连接:
VIN -> 5V 或 3.3V
GND -> GND
SCL -> A5
SDA -> A4
DRDY -> 有特殊需要(每秒获取100次数据)才需要链接
(建议焊接一个排线以避免接触不良)
 
Library 库:
直接在I2C的库里找到HMC5883L文件夹,复制到Arduino的 Library 文件夹下,重启Arduino IDE就可以使用
(如之前没有使用过I2C,需要把I2Cdev也一并复制过去)
 
打开IDE,选择“文件” -> “示例” -> “HMC5883L” -> “Examples” -> “HMC5883L_raw”
或者直接拷贝下面的代码到IDE里:
// Arduino Wire library is required if I2Cdev I2CDEV_ARDUINO_WIRE implementation
// is used in I2Cdev.h
#include "Wire.h"

// I2Cdev and HMC5883L must be installed as libraries, or else the .cpp/.h files
// for both classes must be in the include path of your project
#include "I2Cdev.h"
#include "HMC5883L.h"

// class default I2C address is 0x1E
// specific I2C addresses may be passed as a parameter here
// this device only supports one I2C address (0x1E)
HMC5883L mag;

int16_t mx, my, mz;

#define LED_PIN 13
bool blinkState = false;

void setup() {
// join I2C bus (I2Cdev library doesn't do this automatically)
Wire.begin();

// initialize serial communication
// (38400 chosen because it works as well at 8MHz as it does at 16MHz, but
// it's really up to you depending on your project)
Serial.begin(38400);

// initialize device
Serial.println("Initializing I2C devices...");
mag.initialize();

// verify connection
Serial.println("Testing device connections...");
Serial.println(mag.testConnection() ? "HMC5883L connection successful" : "HMC5883L connection failed");
// configure Arduino LED for
pinMode(LED_PIN, OUTPUT);
}

void loop() {
// read raw heading measurements from device
mag.getHeading(&mx, &my, &mz);

// display tab-separated gyro x/y/z values
Serial.print("mag:\t");
Serial.print(mx); Serial.print("\t");
Serial.print(my); Serial.print("\t");
Serial.print(mz); Serial.print("\t");

// To calculate heading in degrees. 0 degree indicates North
float heading = atan2(my, mx);
if(heading < 0)
heading += 2 * M_PI;
Serial.print("heading:\t");
Serial.println(heading * 180/M_PI);

// blink LED to indicate activity
blinkState = !blinkState;
digitalWrite(LED_PIN, blinkState);
}
上传到Arduino Uno或其他控制板,打开“串口监视器”,选择38400波特(可以根据需要把代码修改成其他波特率),done!

Nodemcu使用教程:软件安装+固件烧录

Simon • 3976 次浏览 • 来自相关话题

本文由面包社区所有,未经允许禁止一切形式的转载!




Nodemcu是一个基于乐鑫ESP-12E WiFi模块的扩展板,由于ESP12-E的设计不太适合一般玩家的开发调试(pin口间距为2mm、需要使用AT指令),因而出现了很多使ESP8266能更方... (阅读全文)
本文由面包社区所有,未经允许禁止一切形式的转载!
nodemcu.jpg

Nodemcu是一个基于乐鑫ESP-12E WiFi模块的扩展板,由于ESP12-E的设计不太适合一般玩家的开发调试(pin口间距为2mm、需要使用AT指令),因而出现了很多使ESP8266能更方便地使用的开发板,Nodemcu就是其中一种也是使用非常广泛的一款,另外相比于Photon等WiFi模块,Nodemcu的价格要便宜得多,另外Nodemcu支持用LUA语言进行发开,使得编程更加轻松和高效。

本文将逐步指导从拿到一块Nodemcu到上手编写代码的过程,以及需要的软硬件。
 
软件准备:
  • ESPlorer:ESPlore 类似于 Arduino IDE,下载地址:http://esp8266.ru/esplorer/(拉倒下面选择蓝色的“DOWNLOAD NOW”),下载完后解压。

 

 

 
 固件升级过程
  • Step1:用USB数据线将Nodemcu连接到电脑,这时电脑会自动安装CP210的驱动程序,装完之后可以在“设备管理器”->“端口”中看到对应的端口,如“COM5”

 
  • Step2:打开ESP Flasher文件夹,根据电脑情况打开对应的 Win32 位或 Win64 位的 Flasher ,准备固件升级。

 
  • Step3:选择 ESP Flasher 的“Config”菜单,点第一条绿色旁边的小齿轮,加载之前下好的Nodemcu最新的固件(.bin文件),回到“Operation”菜单,选择对应的端口,如“COM5”,点“Flash”开始烧录固件,过程中不要拔出Nodemcu!等待进度条走完,有一个绿色的勾勾出现就代表最新的固件烧录成功了!

 
  • Step4:打开ESPlorer,选择9600波特率,点击“OPEN”连接NODEMCU,然后按一下Nodemcu上的“Reset”按钮(有些也标示为RST),之后 ESPlorer 中会出现类似于一下的语句,表示LUA语言的固件就烧录成功了。

NodeMCU 0.9.6 build 20150704  powered by Lua 5.1.4

Blink代码测试
烧录了最新的固件之后我们可以将以下代码粘贴到ESPlorer左边的脚本窗口,然后点击“Send to ESP”对Nodemcu进行测试,如果Nodemcu上的LED等闪烁1秒停顿1秒的话就代表Nodemcu已经可以使用啦。
while 1 do
gpio.write(0, gpio.HIGH)
tmr.delay(1000000) -- wait 1,000,000 us = 1 second
gpio.write(0, gpio.LOW)
tmr.delay(1000000) -- wait 1,000,000 us = 1 second
end
(由于以上代码没有设置结束条件,所以NODEMCU会一直闪烁,需要手动按 Reset 按钮来停止脚本)。
 
Nodemcu更多资料:https://github.com/nodemcu/nodemcu-firmware
Nodemcu官网:http://www.nodemcu.com/
Nodemcu论坛:http://bbs.nodemcu.com/
有问题可以直接发帖求助!