2013年5月3日金曜日

S.H.A ACT.2

 GW後半の部に入りました。今日は、朝からハンダ付け♪。


 短いUSBケーブルやMILコネクタ・ケーブル、バニラシールドへの配線等を行いました。これらを何に使うかというと、



 前半に製作した熱源追跡台車のブレッドボードとジャンパ配線を置き換えて、スッキリさせました。


 センサの固定はあいかわらず、セロテープですけどね・・・。


 ブレッドボードとジャンパ線に比べれば、ずいぶんスッキリした感じ。ついでに、ランニングエレクトロニクスさんのSBDBTも実装できるようにして(まだ、使ってませんが)、ArduinoもUnoからMega ADKに交換しました。なぜ、Mega ADKに替えたかというと・・・


 台車を2階建てにして、


 USB スカッとミサイルランチャーを載せたかったからです。ミサイルを操作するためにUSBホスト機能が欲しかったわけです。


 熱源追跡台車ACT.2 です。ソフトの方がまだまだなので、とんでもない方向で発射したりします。発射のための熱検出のしきい値を低めに設定したら、色んな物に向かって発射してしまいました。プラズマテレビの排熱とかを検出して攻撃を仕掛けたりしてました。「この爆発は人間じゃねぇ・・・」

以下、2016年03月17日に追記しました。
Added on 03 May 17, 2016.

Arduinoのスケッチです。
Arduino sketch is bellow.
#include <Wire.h>
#include <WireExt.h>
#include <DRV8830MotorDriver.h>
#include <AquesTalk.h>
#include <hid.h>
#include <hiduniversal.h>
#include <Usb.h>
#include <usbhost.h>
#include <usbhub.h>
#define D6T_addr 0x0a
#define D6T_cmd 0x4c
// DRV8830 i2c motor driver objects.
DRV8830MotorDriver motor1(DRV8830_A1_A0_open_open);
DRV8830MotorDriver motor2(DRV8830_A1_A0_open_1);
// AquesTalk object.
AquesTalk atk;
// USB objects.
USB usb;
USBHub hub(&usb);
USBHub hub2(&usb);
HIDUniversal hid(&usb);
// global valiable.
int rbuf[35];
float tdata[16];
float t_PTAT;
float top_sum, bottom_sum, left_sum, right_sum, center_sum;
unsigned long pastTimeLast, pastTimeNow;
void setup() {
Wire.begin();
Serial.begin(9600);
Serial.flush();
motor1.setSpeed(0);
motor2.setSpeed(0);
// Initialize USB
if (usb.Init() == -1)
Serial.println("OSC did not start.");
delay(200);
pastTimeLast = millis();
}
void loop() {
int i;
// USB task.
usb.Task();
// speak?
pastTimeNow = millis();
if ((pastTimeNow - pastTimeLast) >= 10000)
{
atk.Synthe("kotti.wo.miroo.");
pastTimeLast = pastTimeNow;
}
Wire.beginTransmission(D6T_addr);
Wire.write(D6T_cmd);
Wire.endTransmission();
if (WireExt.beginReception(D6T_addr) >= 0)
{
i = 0;
for (i = 0; i < 35; i++)
{
rbuf[i] = WireExt.get_byte();
}
WireExt.endReception();
t_PTAT = (rbuf[0] + (rbuf[1] << 8)) * 0.1;
for (i = 0; i < 16; i++)
{
tdata[i] = (rbuf[(i * 2 + 2)] + (rbuf[(i * 2 + 3)] << 8)) * 0.1;
}
top_sum = tdata[0] + tdata[1] + tdata[2] + tdata[3];
bottom_sum = tdata[12] + tdata[13] + tdata[14] + tdata[15];
left_sum = tdata[0] + tdata[4] + tdata[8] + tdata[12];
right_sum = tdata[3] + tdata[7] +tdata[11] + tdata[15];
center_sum = tdata[5] +tdata[6] + tdata[9] + tdata[10];
if (center_sum > 30 * 4)
{
// shoot!!
motor1.setSpeed(0);
motor2.setSpeed(0);
byte cmd[8] = {2, 0x10, 0, 0, 0, 0, 0, 0};
hid.SetReport(0, 0, 2, 0, sizeof(cmd), cmd);
delay(5000);
atk.Synthe("kono.bakuhatuwa.ningen.ja.nee-.");
}
if ((left_sum > center_sum) && (center_sum > right_sum))
{
// turn left.
motor1.setSpeed(-5);
motor2.setSpeed(5);
}
else if ((right_sum > center_sum) && (center_sum > left_sum))
{
// turn right.
motor1.setSpeed(5);
motor2.setSpeed(-5);
}
}
}
DRV8830のライブラリは自作です。
Library of DRV8830 is self-made.
#include <Arduino.h>
#include <Wire.h>
#include "DRV8830MotorDriver.h"
DRV8830MotorDriver::DRV8830MotorDriver(byte address)
{
m_address = address;
Wire.begin();
}
byte DRV8830MotorDriver::getAddress(void)
{
return m_address;
}
int DRV8830MotorDriver::setSpeed(int speed)
{
byte direction;
byte power;
if (speed == 0)
{
direction = 0x00;
}
else if (speed < 0)
{
direction = 0b10;
speed = -1 * speed;
}
else
{
direction = 0b01;
}
power = (byte)(speed & 0xff);
if (power > 0x3a)
{
power = 0x3f;
}
speed = power;
power = (power << 2) | direction;
Wire.beginTransmission(m_address);
Wire.write(0x00);
Wire.write(power);
Wire.endTransmission();
if (direction = 0b10)
{
speed = -1 * speed;
}
return(speed);
}
void DRV8830MotorDriver::brake(void)
{
Wire.beginTransmission(m_address);
Wire.write(0x00);
Wire.write(0x03);
Wire.endTransmission();
}
int DRV8830MotorDriver::getSpeed(void)
{
int speed = 0;
byte data;
Wire.beginTransmission(m_address);
Wire.write(0x00);
Wire.endTransmission();
Wire.requestFrom((int)m_address, 1);
while(Wire.available() == 0);
data = Wire.read();
if ((data & 0x03) == 0b10)
{
speed = -1 * (data >> 2);
}
else
{
speed = data >> 2;
}
return speed;
}
#ifndef DRV8830MotorDriver_h
#define DRV8830MotorDriver_h
#include <Arduino.h>
#include <Wire.h>
#define DRV8830_A1_A0_0_0 0b1100000
#define DRV8830_A1_A0_0_open 0b1100001
#define DRV8830_A1_A0_0_1 0b1100010
#define DRV8830_A1_A0_open_0 0b1100011
#define DRV8830_A1_A0_open_open 0b1100100
#define DRV8830_A1_A0_open_1 0b1100101
#define DRV8830_A1_A0_1_0 0b1100110
#define DRV8830_A1_A0_1_open 0b1100111
#define DRV8830_A1_A0_1_1 0b1101000
class DRV8830MotorDriver
{
public:
DRV8830MotorDriver(byte address);
int setSpeed(int speed);
byte getAddress(void);
void brake(void);
int getSpeed(void);
private:
byte m_address;
};
#endif

0 件のコメント:

コメントを投稿