极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

楼主: 黑马

我的自平衡小车之第一步——读取九轴姿态传感器并显示到OLED

  [复制链接]
发表于 2012-5-9 00:48:43 | 显示全部楼层
问下 OLED 哪里买的呀?
谢谢
回复 支持 反对

使用道具 举报

发表于 2012-5-9 07:56:03 | 显示全部楼层
GIOCHEN 发表于 2012-5-9 00:48
问下 OLED 哪里买的呀?
谢谢

记得thomas的帖子里有介绍地址
回复 支持 反对

使用道具 举报

发表于 2012-5-9 21:46:29 | 显示全部楼层
弘毅 发表于 2012-5-9 07:56
记得thomas的帖子里有介绍地址

谢谢啦,我去 找找 买了几块 都不合适
回复 支持 反对

使用道具 举报

发表于 2012-5-12 13:39:48 | 显示全部楼层
本帖最后由 Ryanli 于 2012-5-12 13:41 编辑

D://1.jpg[/img]
  1. #include <Wire.h>           // IIC运行库
  2. //#include <SSD1306.h>        // OLED运行库

  3. //#define OLED_CS 42          // CS脚
  4. //#define OLED_CLK 44         // CLK脚
  5. //#define OLED_MOSI 46        // MISO脚
  6. //#define OLED_RESET 48       // RST脚
  7. //#define OLED_DC 50          // D/C脚

  8. //SSD1306 oled(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
  9.                             // 定义OLED
  10. #define Acc 0x1D;           // ADXL345的I2C地址
  11. #define Gyr 0x69;           // L3G4200D的I2C地址
  12. #define Mag 0x1E;           // HMC5883L的I2C地址

  13. char str[16];               // 输出字符串(切勿溢出)
  14. int curve[128];             // 曲线数据
  15. int i = 0;

  16. void setup() {
  17.     //oled.ssd1306_init(SSD1306_SWITCHCAPVCC);
  18.     //oled.clear();            // 清空oled屏
  19.     //oled.drawstring(0, 0, "Setting up...");
  20.     //oled.display();          // 显示到oled
  21.                              // 初始化OLED
  22.     Serial.begin(9600);
  23.     sensor_init();           // 初始化传感器
  24.     delay(2000);
  25. }
  26. void loop() {
  27.   int x;
  28.   curve[i]=gDat(Gyr,0);            // 读取传感器,根据需要读取不同传感器数据
  29.   if (curve[i] < -26) curve[i] = -26; // 上溢出
  30.   if (curve[i] > 26) curve[i] = 26;   // 下溢出
  31.   //oled.clear();                       // 清空oled屏
  32.   
  33.   for (x = 0; x < 127; x++)
  34.   {
  35.     Serial.print("x=");// 输出字符串
  36.     Serial.println(curve[i]);         // 输出到到oled             //oled.drawline(x, 37 - curve[x], x+1, 37 - curve[x+1], WHITE);
  37.   }                                   // 绘制曲线
  38.   //oled.display();                     // 显示到oled
  39.   i++;
  40.   if (i == 128) i = 0;
  41.   delay(10);
  42. }

  43. int gDat(int device, int axis) {

  44. // 读九轴姿态传感器寄存器函数
  45. // For Arduino, by 黑马
  46. // 调用参数表
  47. //   type    device      axis
  48. //                    0   1   2
  49. // ADXL345     Acc    x   y   z
  50. // L3G4200D    Gyr    x   y   z
  51. // HMC5883L    Mag    x   z   y
  52. // Example
  53. // 00 #include <Wire.h>
  54. // 01 #define Acc 0x1D;
  55. // 02 #define Gyr 0x69;
  56. // 03 #define Mag 0x1E;
  57. // 04
  58. // 05  void setup() {
  59. // 06    sensor_init();
  60. // 07    delay(1000);
  61. // 08  }
  62. // 09
  63. // 10  void loop() {
  64. // 11    Z-Gyroscope = gDat(Gyr, 2);
  65. // 12    delay(50);
  66. // 13  }

  67.     int v;
  68.     byte vL, vH, address;               // 存放byte数值
  69.     if (device == Acc) address = 0x32;  // ADXL345的读数地址
  70.     if (device == Gyr) address = 0xA8;  // L3G4200D的读数地址
  71.     if (device == Mag) address = 0x03;  // HMC5883L的读数地址
  72.     address = address + axis * 2;       // 数据偏移-坐标轴
  73.     Wire.beginTransmission(device);     // 开始传输数据
  74.     Wire.send(address);                 // 发送指针
  75.     Wire.requestFrom(device, 2);        // 请求2 byte数据
  76.     while(Wire.available() < 2);        // 成功获取前等待
  77.     vL = Wire.receive();
  78.     vH = Wire.receive();                // 读取数据
  79.     Wire.endTransmission();             // 结束传输
  80.     if (device == Mag) v = (vL << 8) | vH;
  81.     else v = (vH << 8) | vL;            // 将byte数据合并为Int
  82.     return v;                           // 返回读书值
  83. }

  84. void sensor_init() {                         // 配置九轴姿态传感器
  85.     writeRegister(Acc, 0x2D, 0b00001000);    // 测量模式
  86.                             // 配置ADXL345
  87.     writeRegister(Gyr, 0x20, 0b00001111);    // 设置睡眠模式、x, y, z轴使能
  88.     writeRegister(Gyr, 0x21, 0b00000000);    // 选择高通滤波模式和高通截止频率
  89.     writeRegister(Gyr, 0x22, 0b00000000);    // 设置中断模式
  90.     writeRegister(Gyr, 0x23, 0b00110000);    // 设置量程(2000dps)、自检状态、SPI模式
  91.     writeRegister(Gyr, 0x24, 0b00000000);    // FIFO & 高通滤波
  92.                             // 配置L3G4200D(2000 deg/sec)
  93.     writeRegister(Mag, 0x02, 0x00);          // 连续测量
  94.                             // 配置HMC5883L
  95. }

  96. void writeRegister(int device, byte address, byte val) {    // 写寄存器
  97.     Wire.beginTransmission(device);
  98.     Wire.send(address);
  99.     Wire.send(val);
  100.     Wire.endTransmission();
  101. }
复制代码
前辈你好,我是第一次用arduino,因为没有显示屏所以我把你的程序稍稍改了一下,想用串口观察,可是为什么出现好多同一种错误呢?还望前辈解答啊。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2012-5-14 22:15:53 | 显示全部楼层
黑马 发表于 2012-3-22 09:38
Powerpoint 2007……

黑马  L3G4200D和ITG3205有啥区别?我的九轴是ITG3205的,现在要测试。好好研究研究才行!
回复 支持 反对

使用道具 举报

发表于 2012-5-29 19:18:38 | 显示全部楼层
本帖最后由 darkorigin 于 2012-5-29 19:28 编辑

今天入了个9轴模块,哈哈,很便宜。。等明天到货晒出来,
另外还有一ENC28J60的网络模块,也粉便宜说、嘎嘎
(之前打错了,呵呵,感谢弘毅大哥指正,HOHO!~~~~~)
回复 支持 反对

使用道具 举报

发表于 2012-5-29 19:25:44 | 显示全部楼层
darkorigin 发表于 2012-5-29 19:18
今天入了个9轴模块,哈哈,很便宜。。等明天到货晒出来,
另外还有一NEC的网络模块,也粉便宜说、嘎嘎

{:soso_e103:} NEC网络模块。。。没见过。。坐等明天帖子。。。
回复 支持 反对

使用道具 举报

发表于 2012-5-29 19:27:59 | 显示全部楼层
本帖最后由 darkorigin 于 2012-5-29 19:34 编辑
弘毅 发表于 2012-5-29 19:25
NEC网络模块。。。没见过。。坐等明天帖子。。。


说错了,是ENC28J60 的,不是NEC,哈哈,手误!!!

另外提下,我买到的貌似是9轴加气压传感的,就是4个感应芯片
L3G4200D+ADXL345+HMC5883L+BMP085
貌似看原理图上,还带1个电源稳压管,支持5V或者3.3电压的
回复 支持 反对

使用道具 举报

发表于 2012-5-29 19:44:06 | 显示全部楼层
研究了下传感器的数据手册。发现IIC地址是可以定义的。不过貌似只有2个地址选1个?
不知道是不是这样, 哪个高手知道方便的话回复下,谢谢!
回复 支持 反对

使用道具 举报

发表于 2012-5-29 19:48:37 | 显示全部楼层
darkorigin 发表于 2012-5-29 19:44
研究了下传感器的数据手册。发现IIC地址是可以定义的。不过貌似只有2个地址选1个?
不知道是不是这样, 哪 ...


恩,一般是这样子的,两个地址选择一个。。ADXL345和ITG3205都可以选择。
回复 支持 反对

使用道具 举报

发表于 2012-5-29 19:58:50 | 显示全部楼层
弘毅 发表于 2012-5-29 19:48
恩,一般是这样子的,两个地址选择一个。。ADXL345和ITG3205都可以选择。

之前不是有查询I2C地址的代码吗?直接可以看,真好,不过我发现有时间超过了那个120的范围,就查不到了!
回复 支持 反对

使用道具 举报

发表于 2012-5-29 20:29:50 | 显示全部楼层
Randy 发表于 2012-5-29 19:58
之前不是有查询I2C地址的代码吗?直接可以看,真好,不过我发现有时间超过了那个120的范围,就查不到了!

不是吧,很多元件都是120以后啊,比如0XD1=209了啊。。。。。
而且按照理解应该可以有0X00-0XFF也就是说256个地址啊,120就无效了?
回复 支持 反对

使用道具 举报

发表于 2012-5-29 20:30:43 | 显示全部楼层
我先等模块到了再说,用MWC的程序上去测。看看如何,哈哈
用人家的开源项目中的模块,应该很爽啊
回复 支持 反对

使用道具 举报

发表于 2012-5-29 20:55:39 | 显示全部楼层
darkorigin 发表于 2012-5-29 20:29
不是吧,很多元件都是120以后啊,比如0XD1=209了啊。。。。。
而且按照理解应该可以有0X00-0XFF也就是说 ...

嗯,这个我知道,我说的是之前一位友好贴出来的一个代码,那个代码是专门查询I2C地址的,只设置了120个,但是可以调的!呵呵!
回复 支持 反对

使用道具 举报

发表于 2012-5-29 21:05:54 | 显示全部楼层
本帖最后由 darkorigin 于 2012-5-29 21:07 编辑
Randy 发表于 2012-5-29 20:55
嗯,这个我知道,我说的是之前一位友好贴出来的一个代码,那个代码是专门查询I2C地址的,只设置了120个, ...


我是看你说120以后都有问题,以为。。。。。

代码已经改了
byte end_address = 255;
好歹还是有基本编程基础的(毕竟当年还是摸着turbo pascal 和turbo C出来的,虽然学的东西基本都快忘光了);

再次感谢热心,呵呵,我们这些新手。。多亏坛子里面热心的朋友帮助,才有提高。。。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-20 14:24 , Processed in 0.043701 second(s), 20 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表