おんどとりとHEMSで測ってみよう! -10ページ目

おんどとりとHEMSで測ってみよう!

地元HMで建てたおうちのいろんなことを測ってみます。

前回ご紹介したアーム付きラジコン戦車を作ってみたいという方からメッセージをいただきました。

どうもありがとうございました。(‐^▽^‐)

今回は、同じように作ってみたいという方のお役に立てるように、回路図・プログラム・基板写真などをまとめて公開したいと思います。

(準備)
作る前に、TOCOSのTWE-Lite Dipのプログラムを書き換えなければなりません。
標準では4点のデジタル入出力を扱えるのですが、今回の工作では6点必要だからです。
TWE-Liteで使える様々なアプリが公開されていますが、その中の「リモコン通信アプリ」を使います。これで12点のデジタル入出力を扱うことができます。
http://mono-wireless.com/jp/products/TWE-ZERO/App_IO/
TOCOSのホームページからバイナリイメージをダウンロードし、TWE-Lite R(書き込み装置)を使ってTWE-Lite Dipのプログラムを書き換えます。

TWE-Lite R を使う際は、写真の赤矢印部分をショートするのを忘れないでください。
レオはめんどくさいので、完全ショートさせていますが、外部電源を使う可能性がある方は、ジャンパーピンを立てておくと便利でしょう。

(基板)
リモートコントロール側(子機)
表面


裏面


ちょっと分かりづらいですが、リモコンの配線をTOCOSのピンにつなぎこんでいます。後で外せるように、ピンソケットとピンヘッダを使っています。ちょっとしたソケット代わりに便利に使えるので、長いのを数本用意しておくと何かと楽チンです。

戦車側(親機)
表面


裏面


へたくそですいません。(^_^;)
基板は秋月のBタイプです。(部品は全部秋月から買っています。)
信号系は細い青色の配線、動力系は黄色い太い配線を使っています。
上部から出ているピンヘッダは、PICのプログラム用です。(子供らが遊び倒したせいで曲がっていますね。)
回路図にはありませんが、あると遊びながらプログラムを変更できるので便利です。
モーターと基板の接続はターミナルを使っています。
丈夫の青×2がキャタピラ駆動モータ、横の緑が電池、横の青がアーム駆動モータにつながっています。
ターミナル接続にしておくとモータの極性を間違って接続してもすぐに直せて便利です。(^▽^;)

(回路図)


回路図は大きいので、拡大して見てください。
左下が子機コントローラーの回路になります。

残りは親機戦車の回路です。
I2Cを介してDRV8830というドライバーを3個並列にPICに接続します。3個を区別するためにA0とA1の接続が少しずつ異なるので注意してください。
DRV8830に1Ωの抵抗を5個並列に接続していますが、もし0.2Ωの抵抗があれば、それ1個でかまいません。
この抵抗は、DRV8830をまともに動かすためには必須です。
ですが、添付のマニュアルには何も書かれていません。ヽ(`Д´)ノ
レオは、ストロベリーリナックスの同等品のマニュアルの回路図を見てようやく0.2Ω抵抗をつければよいことに気がつきました。

親機と子機で、TWE-Lite Dipのピン名称が異なるので、注意してください。

プログラムが長いので、その前にいつものを貼らせてください。

にほんブログ村 住まいブログ 一戸建住宅(施主)へ にほんブログ村 環境ブログ 風力発電・太陽光発電へ にほんブログ村 地域生活(街) 東北ブログ 山形県情報へ
にほんブログ村  にほんブログ村  にほんブログ村
 ブログランキング
エコ住宅 ブログランキングへ

(プログラム)
前回同様、「がんばるPIC」さんと「趣味のぶろぐ」さんを参考にさせていただきました。
以降、全てプログラムです。
(2016/5/21追記:開発環境はMPLAB IDE v8.92 + XC8コンパイラです。)
今回は、これで終わりです。次回はハワイの電気料金書きたいけど、まとめるのが難しい~。

/*
* File: newmain.c
* Author:
*
* Created on 2014/08/17, 18:00
* Arranged on 2015/09/05, 13:00
*/

#pragma config WDTE = OFF


#include
#include
#include //delayを使うのに必要
#include //レジスタの定義に必要
#define _XTAL_FREQ 16000000 // delay用に必要(クロック16MHzを指定)
#define SDA RB5
#define SCL RB4
#define TRISSDA TRISB5
#define TRISSCL TRISB4
#define DRV1ADR 0xc8
#define DRV2ADR 0xc6
#define DRV3ADR 0xc2
#define I2C_ADR 0x7c //Display Address
#define DUS 1 //I2C Clock( usec)
#define DelayMS 20 //Delay for LED
#define LED1 RA2
#define DI1 RB0
#define DI2 RB1
#define DI3 RB2
#define DI4 RB3
#define DI5 RA3
#define DI6 RA4

void LEDrepeat(unsigned char number);
void I2CStart(void);
void I2CStop(void);
unsigned char I2COut(unsigned char data);
void DRV1STOP(void);
void DRV1FWD(unsigned char SpeedOut);
void DRV1RVS(unsigned char SpeedOut);
void DRV1CLR(void);
void DRV2STOP(void);
void DRV2FWD(unsigned char SpeedOut);
void DRV2RVS(unsigned char SpeedOut);
void DRV2CLR(void);
void DRV3STOP(void);
void DRV3FWD(unsigned char SpeedOut);
void DRV3RVS(unsigned char SpeedOut);
void DRV3CLR(void);

int main(int argc, char** argv) {

unsigned char Forward;
unsigned char Reverse;
unsigned char Left;
unsigned char Right;
unsigned char ForwardPrev;
unsigned char ReversePrev;
unsigned char LeftPrev;
unsigned char RightPrev;
unsigned char Speed;
unsigned char UP;
unsigned char DOWN;
unsigned char UPPrev;
unsigned char DOWNPrev;
UPPrev = 0;
DOWNPrev = 0;

OSCCON = 0b01111011; // 16MHz Internal Clock
PORTA = 0x00; // All PORT Clear
PORTB = 0x00;
ANSELA = 0x00;
ANSELB = 0x00;
TRISA=0b00011000; //RA all pin output
TRISB=0b00001111; //RB 0,1,2,3 input SDA,SCL > output
C1ON = 0; // Comparator disable
C2ON = 0;
Speed = 0x80; //Speed

SDA=1;SCL=1;

//TRIP test if trip , LED sign repeated
__delay_ms(500);
LED1=1;
LEDrepeat(5);
//DRV8830 Error Reset
DRV1CLR();
DRV2CLR();
DRV3CLR();

while(1){
Forward = (DI1==0);
Reverse = (DI2==0);
Left = (DI3==0);
Right = (DI4==0);
UP = (DI5==0);
DOWN = (DI6==0);
if (Forward == 1 & ForwardPrev == 0){
LEDrepeat(2);
}else{
if (Reverse == 1 & ReversePrev == 0){
LEDrepeat(2);
}else{
if (Left == 1 & LeftPrev == 0){
LEDrepeat(2);
}else{
if (Right ==1 & RightPrev == 0){
LEDrepeat(2);
}
}
}
}
if (Forward != ForwardPrev | Reverse != ReversePrev | Left != LeftPrev | Right != RightPrev){
if(Forward == 1){
if(Left == 1){
DRV1STOP();
DRV2FWD(Speed);
LEDrepeat(2);
}else{
if(Right == 1){
DRV1FWD(Speed);
DRV2STOP();
LEDrepeat(2);
}else{
DRV1FWD(Speed);
DRV2FWD(Speed);
LEDrepeat(2);
}
}
}
if(Reverse ==1){
if(Left == 1){
DRV1STOP();
DRV2RVS(Speed);
LEDrepeat(2);
}else{
if(Right == 1){
DRV1RVS(Speed);
DRV2STOP();
LEDrepeat(2);
}else{
DRV1RVS(Speed);
DRV2RVS(Speed);
LEDrepeat(2);
}
}
}
if(Left == 1 & Forward == 0 & Reverse == 0){
DRV1RVS(Speed);
DRV2FWD(Speed);
LEDrepeat(2);
}
if(Right == 1 & Forward == 0 & Reverse == 0){
DRV1FWD(Speed);
DRV2RVS(Speed);
LEDrepeat(2);
}
if(Right == 0 & Left == 0 & Forward == 0 & Reverse == 0){
DRV1STOP();
DRV2STOP();
LEDrepeat(1);
}
ForwardPrev=Forward;
ReversePrev=Reverse;
LeftPrev=Left;
RightPrev=Right;
LEDrepeat(1);
}
if (UP != UPPrev | DOWN != DOWNPrev){
if(UP == 1){
DRV3FWD(Speed);
LEDrepeat(2);
}
if(DOWN == 1){
DRV3RVS(Speed);
LEDrepeat(2);
}
if(UP == 0 & DOWN == 0){
DRV3STOP();
LEDrepeat(2);
}
UPPrev=UP;
DOWNPrev=DOWN;
LEDrepeat(1);
}
}

return (EXIT_SUCCESS);
}
void LEDrepeat(unsigned char number)
{
unsigned char i;
for(i=0;i {
LED1 = 0;
__delay_ms(DelayMS);
LED1 = 1;
__delay_ms(DelayMS);
}
}
void DRV1CLR(void)
{
I2CStart();
I2COut(DRV1ADR);
I2COut(0x01);
I2COut(0b10000000);
I2CStop();
}
void DRV1FWD(unsigned char SpeedOut)
{
I2CStart();
I2COut(DRV1ADR);
I2COut(0x00);
I2COut(SpeedOut+1);
I2CStop();
}
void DRV1RVS(unsigned char SpeedOut)
{
I2CStart();
I2COut(DRV1ADR);
I2COut(0x00);
I2COut(SpeedOut+2);
I2CStop();
}
void DRV1STOP(void)
{
I2CStart();
I2COut(DRV1ADR);
I2COut(0x00);
I2COut(0x00);
I2CStop();
}
void DRV2CLR(void)
{
I2CStart();
I2COut(DRV2ADR);
I2COut(0x01);
I2COut(0b10000000);
I2CStop();
}
void DRV2FWD(unsigned char SpeedOut)
{
I2CStart();
I2COut(DRV2ADR);
I2COut(0x00);
I2COut(SpeedOut+1);
I2CStop();
}
void DRV2RVS(unsigned char SpeedOut)
{
I2CStart();
I2COut(DRV2ADR);
I2COut(0x00);
I2COut(SpeedOut+2);
I2CStop();
}
void DRV2STOP(void)
{
I2CStart();
I2COut(DRV2ADR);
I2COut(0x00);
I2COut(0x00);
I2CStop();
}
void DRV3CLR(void)
{
I2CStart();
I2COut(DRV3ADR);
I2COut(0x01);
I2COut(0b10000000);
I2CStop();
}
void DRV3FWD(unsigned char SpeedOut)
{
I2CStart();
I2COut(DRV3ADR);
I2COut(0x00);
I2COut(SpeedOut+1);
I2CStop();
}
void DRV3RVS(unsigned char SpeedOut)
{
I2CStart();
I2COut(DRV3ADR);
I2COut(0x00);
I2COut(SpeedOut+2);
I2CStop();
}
void DRV3STOP(void)
{
I2CStart();
I2COut(DRV3ADR);
I2COut(0x00);
I2COut(0x00);
I2CStop();
}
void I2CStart(void)
{
SDA = 1;
__delay_us(DUS);
SCL = 1;
__delay_us(DUS);
SDA = 0;
__delay_us(DUS);
SCL = 0;
__delay_us(DUS);
}
void I2CStop(void)
{
SCL = 0;
__delay_us(DUS);
SDA = 0;
__delay_us(DUS);
SCL = 1;
__delay_us(DUS);
SDA = 1;
__delay_us(DUS);
}
unsigned char I2COut(unsigned char data)
{
int i;
unsigned char BitPos;
unsigned char ACK;
TRISSDA = 0;
BitPos = 0x80;
for(i=0;i<8;i++)
{
SCL = 0;
if((data & BitPos)!= 0)
{
SDA = 1;
}
else
{
SDA = 0;
}
BitPos = BitPos >> 1;
__delay_us(DUS);
SCL = 1;
__delay_us(DUS);
SCL = 0;
__delay_us(DUS);
}
TRISSDA = 1;
SCL = 1;
__delay_us(DUS);
ACK = SDA;
__delay_us(DUS);
SCL = 0;
__delay_us(DUS);
SDA = 1;
TRISSDA = 0;
__delay_us(DUS);
return(ACK);
}