Front page   Edit Freeze Diff Backup Upload Copy Rename Reload   New List of pages Search Recent changes   Help   RSS of recent changes

Arduino Nano + Acceleration Sensor

Last-modified: 2012-08-20 (Mon) 00:29:30 (1915d)
Top / Arduino Nano + Acceleration Sensor

Arduino Nano + Acceleration Sensor

arduino_nano_acc.jpg arduino_nano_acc_result.jpg

1枚のブレッドボードに、Arduino Nanoと 3軸加速度センサモジュール(秋月電子通商:KXM52-1050)を載せました。

Arduino Nanoは、ADCでセンサモジュールの信号を読み取るとともに、その信号をシリアル通信でPCに送信します。

Arduino Nanoからセンサ信号を受け取り、PCのディスプレイにグラフ表示するプログラムは、Processingで実現しました。

サンプルプログラム

Arduino Nano

int ad_pin_a[3] = { 1, 0, 2 };
int a[3];

void tx_word(int data)
{
  Serial.print((0x00ff & (data >> 8)), BYTE);
  Serial.print((0x00ff & data), BYTE);
}

void setup()
{
  Serial.begin(9600);
}

void loop()
{
  int i;

  for (i = 0; i < 3; i++) {
    a[i] = analogRead(ad_pin_a[i]);
  }

  if (Serial.available() > 0) {
    tx_word(a[Serial.read()]);
  }
}

Processing

import processing.serial.*;

Serial port;

int w = 800;
int h = 600;
int y0 = h/2;
int bias = 512;

boolean draw_flag = true;

int[] a = new int[3];
int[] a_offset = new int[3];

int t = 0;

int rx_word()
{
  int data;
  
  data = (port.read() << 8) + port.read();
  
  return data;
}

void draw_axis()
{
  stroke(0);
  line(0, y0, w, y0);
}

void plot_data(int data, char c)
{
  if (c == 'r') stroke(255, 0, 0);
  if (c == 'g') stroke(0, 255, 0);
  if (c == 'b') stroke(0, 0, 255);
  strokeWeight(5);
  point(t, y0 - (int)(0.6*(data - bias)));
  strokeWeight(1);
}

void setup()
{
  port = new Serial(this, "COM2", 9600);
  
  size(w, h);
  
  for (int i = 0; i < 3; i++) {
    a_offset[i] = 0;
  }
}

void draw()
{
  for (int i = 0; i < 3; i++) {
    port.write(i);
    a[i] = rx_word() - a_offset[i];
  }
  
  for (int i = 0; i < 3; i++) {
    print(a[i]);
    print(' ');
  }
  println();
  
  if (draw_flag) {
    if (t == 0) background(255);
    draw_axis();
    
    plot_data(a[0], 'r');
    plot_data(a[1], 'g');
    plot_data(a[2], 'b');
    
    t = (t+1) % w;
  }
}

void mouseClicked()
{
  draw_flag = !draw_flag;  
}

void keyPressed()
{
  if (key == 'c')
  {
    for (int i = 0; i < 3; i++) {
      port.write(i);
      a_offset[i] = rx_word();
    }
    a_offset[0] -= 512;
    a_offset[1] -= 512;
    //a_offset[2] -= 768;
    a_offset[2] -= 710;
  }
}

デモ


Attach file: filearduino_nano_acc_result.jpg 1086 download [Information] filearduino_nano_acc.jpg 1272 download [Information]