test
This commit is contained in:
parent
0ced1effbd
commit
5d38cab413
10 changed files with 468 additions and 21 deletions
34
DigitalReadSerialX8.cpp
Normal file
34
DigitalReadSerialX8.cpp
Normal file
|
@ -0,0 +1,34 @@
|
|||
/*
|
||||
DigitalReadSerialX8.cpp
|
||||
(C)2013 kou029w - MIT License
|
||||
*/
|
||||
#if defined(ARDUINO) && ARDUINO >= 100
|
||||
#include <Arduino.h>
|
||||
#else
|
||||
#include <WProgram.h>
|
||||
#endif
|
||||
#include "DigitalReadSerialX8.h"
|
||||
|
||||
template<>
|
||||
void DigitalReadSerialX8(HardwareSerial& serial, uint8_t minPin);
|
||||
#ifdef __AVR_ATmega32U4__
|
||||
template<>
|
||||
void DigitalReadSerialX8(Serial_& serial, uint8_t minPin);
|
||||
#endif
|
||||
|
||||
template<typename T>
|
||||
void DigitalReadSerialX8(T& serial, uint8_t minPin=12){
|
||||
if(!serial) return;
|
||||
for(int i=minPin; i<minPin+8; i++){
|
||||
pinMode(i, INPUT);
|
||||
}
|
||||
serial.println("Press any key to end.");
|
||||
delay(1000);
|
||||
while(serial.available() == 0){
|
||||
for(int i=minPin; i<minPin+8; i++){
|
||||
serial.print('\t');
|
||||
serial.print(digitalRead(i));
|
||||
}
|
||||
serial.print('\n');
|
||||
}
|
||||
}
|
31
DigitalReadSerialX8.h
Normal file
31
DigitalReadSerialX8.h
Normal file
|
@ -0,0 +1,31 @@
|
|||
/*
|
||||
DigitalReadSerialX8.h - センサーアレイ(8つ)の動作を確認するためのライブラリ
|
||||
|
||||
## 概要 ##
|
||||
このライブラリは、シリアルモニター上から8つのセンサーアレイの動作を確認するためのシンプルなライブラリです。
|
||||
|
||||
## 使い方 ##
|
||||
例:
|
||||
#include "DigitalReadSerialX8.h"
|
||||
void setup(){
|
||||
Serial.begin(9600);
|
||||
DigitalReadSerial_x8(Serial, 12); //この場合、pin12-pin19をみる
|
||||
}
|
||||
void loop(){
|
||||
}
|
||||
|
||||
## ライセンス ##
|
||||
(C)2013 kou029w - MIT License
|
||||
*/
|
||||
|
||||
#ifndef DigitalReadSerialX8_h
|
||||
#define DigitalReadSerialX8_h
|
||||
#if defined(ARDUINO) && ARDUINO >= 100
|
||||
#include <Arduino.h>
|
||||
#else
|
||||
#include <WProgram.h>
|
||||
#endif
|
||||
|
||||
template<typename T> void DigitalReadSerialX8(T& serial, uint8_t minPin);
|
||||
|
||||
#endif
|
61
Motor.cpp
Normal file
61
Motor.cpp
Normal file
|
@ -0,0 +1,61 @@
|
|||
/*
|
||||
Motor.cpp
|
||||
(C)2013 kou029w - MIT License
|
||||
*/
|
||||
#include "Motor.h"
|
||||
|
||||
Motor::Motor(){
|
||||
_pin1 = -1;
|
||||
_pin2 = -1;
|
||||
}
|
||||
|
||||
void Motor::mode(uint8_t mode){
|
||||
if(_pin1 != -1) digitalWrite(_pin1, (mode>>0)&1);
|
||||
if(_pin2 != -1) digitalWrite(_pin2, (mode>>1)&1);
|
||||
}
|
||||
|
||||
void Motor::mode(uint8_t mode, uint8_t speed){
|
||||
switch(mode){
|
||||
case GO:
|
||||
if(_pin1 != -1) analogWrite(_pin1, speed);
|
||||
if(_pin2 != -1) digitalWrite(_pin2, LOW);
|
||||
break;
|
||||
case BACK:
|
||||
if(_pin1 != -1) analogWrite(_pin1, ~speed);
|
||||
if(_pin2 != -1) digitalWrite(_pin2, HIGH);
|
||||
break;
|
||||
default:
|
||||
if(_pin1 != -1) digitalWrite(_pin1, (mode>>0)&1);
|
||||
if(_pin2 != -1) digitalWrite(_pin2, (mode>>1)&1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void Motor::speed(int speed){
|
||||
if(speed>=0) mode(GO, speed);
|
||||
else mode(BACK, -speed);
|
||||
}
|
||||
|
||||
void Motor::attach(uint8_t pin1){
|
||||
_pin1 = pin1;
|
||||
_pin2 = -1;
|
||||
pinMode(_pin1, OUTPUT);
|
||||
digitalWrite(_pin1, LOW);
|
||||
}
|
||||
|
||||
void Motor::attach(uint8_t pin1, uint8_t pin2){
|
||||
_pin1 = pin1;
|
||||
_pin2 = pin2;
|
||||
pinMode(_pin1, OUTPUT);
|
||||
pinMode(_pin2, OUTPUT);
|
||||
digitalWrite(_pin1, LOW);
|
||||
digitalWrite(_pin2, LOW);
|
||||
}
|
||||
|
||||
void Motor::detach(){
|
||||
mode(STOP);
|
||||
pinMode(_pin1, INPUT);
|
||||
pinMode(_pin2, INPUT);
|
||||
_pin1 = -1;
|
||||
_pin2 = -1;
|
||||
}
|
75
Motor.h
Normal file
75
Motor.h
Normal file
|
@ -0,0 +1,75 @@
|
|||
/*
|
||||
Motor.h - モータードライバ(1ピン/2ピン)のためのライブラリ
|
||||
|
||||
## 概要 ##
|
||||
このライブラリは、1ピンあるいは2ピンを占有するモータードライバのためのシンプルなライブラリです。
|
||||
PWM対応ピンが1つしか必要ないのがこのライブラリの特徴です。
|
||||
ただし、その副作用として、GOとBACKの速度に差があることがあります。
|
||||
|
||||
## 使い方 ##
|
||||
例:
|
||||
#include "Motor.h"
|
||||
Motor motor;
|
||||
void setup(){
|
||||
// motor.attach(pin1, pin2);
|
||||
motor.attach(5, 6);
|
||||
}
|
||||
void loop(){
|
||||
// motor.mode(GO); //正転
|
||||
motor.mode(GO, 100); //0-255(ここでは、100)のスピードで正転
|
||||
delay(1000);
|
||||
motor.mode(STOP); //停止
|
||||
delay(1000);
|
||||
}
|
||||
|
||||
注意:
|
||||
使用するモータードライバの動作は、
|
||||
1ピンの場合:
|
||||
動作 |pin1
|
||||
-----+-----
|
||||
STOP | L
|
||||
GO | H
|
||||
|
||||
2ピンの場合:
|
||||
動作 |pin1 |pin2
|
||||
----------+-----+-----
|
||||
STOP | L | L
|
||||
GO | H | L
|
||||
BACK | L | H
|
||||
STOP/BRAKE| H | H
|
||||
|
||||
でなければなりません。また、
|
||||
void Motor::mode(char mode, byte speed);
|
||||
void Motor::speed(int speed);
|
||||
|
||||
これらを使用する場合、pin1はPWM対応でなければなりません。
|
||||
|
||||
## ライセンス ##
|
||||
(C)2013 kou029w - MIT License
|
||||
*/
|
||||
|
||||
#ifndef Motor_h
|
||||
#define Motor_h
|
||||
#if defined(ARDUINO) && ARDUINO >= 100
|
||||
#include <Arduino.h>
|
||||
#else
|
||||
#include <WProgram.h>
|
||||
#endif
|
||||
|
||||
enum { STOP = 0, GO = 1, BACK = 2, BRAKE = 3 };
|
||||
|
||||
class Motor{
|
||||
public:
|
||||
Motor();
|
||||
void mode(uint8_t mode);
|
||||
void mode(uint8_t mode, uint8_t speed);
|
||||
void speed(int speed);
|
||||
void attach(uint8_t pin1);
|
||||
void attach(uint8_t pin1, uint8_t pin2);
|
||||
void detach();
|
||||
private:
|
||||
char _pin1;
|
||||
char _pin2;
|
||||
};
|
||||
|
||||
#endif
|
37
README.md
37
README.md
|
@ -32,6 +32,21 @@
|
|||
Servomotor for steering - ステアリング用サーボモーター
|
||||
Servomotor for lance - ランス用サーボモーター
|
||||
|
||||
### 車体仕様 ###
|
||||
* ホイールベース : 約150mm
|
||||
* 車重 : 1kg以下
|
||||
* 車体材料 : タミヤ ユニバーサルプレートL
|
||||
* 使用ギアボックス : タミヤ ハイスピードギアボックスHE
|
||||
* ギア比 : 11.6:1
|
||||
* 使用モーター : 上記ギアボックスに付属するもの
|
||||
* 使用サーボモーター : enRoute DHCM(ステアリング用)/Savox SC-0352(ランス用)
|
||||
|
||||
### 回路仕様 ###
|
||||
* 動作電圧 : 7.2V以上
|
||||
* 使用マイコン : Atmel AVR (Arduino)
|
||||
* 使用センサーアレイ : SG-2BC x 8 (ロボラボ講習会のもの)
|
||||
* 使用ロータリーエンコーダー : 公式マイコンカーキットのものを使用
|
||||
|
||||
### Software ###
|
||||
[count/mark]
|
||||
|
|
||||
|
@ -51,28 +66,8 @@
|
|||
steering - ステアリングの動作
|
||||
lance - ランスの動作
|
||||
|
||||
### 車体仕様 ###
|
||||
* ホイールベース : 約150mm
|
||||
* 車重 : 1kg以下
|
||||
* 車体材料 : タミヤ ユニバーサルプレートL
|
||||
* 使用ギアボックス : タミヤ ハイスピードギアボックスHE
|
||||
* ギア比 : 11.6:1
|
||||
* 使用モーター : 上記ギアボックスに付属するもの
|
||||
* 使用サーボモーター : enRoute DHCM(ステアリング用)/Savox SC-0352(ランス用)
|
||||
|
||||
### 回路仕様 ###
|
||||
* 動作電圧 : 7.2V以上
|
||||
* 使用マイコン : Atmel AVR (Arduino)
|
||||
* 使用センサーアレイ : SG-2BC x 8 (ロボラボ講習会のものを踏襲)
|
||||
* 使用ロータリーエンコーダー : 公式マイコンカーキットのものを使用
|
||||
|
||||
### ソフトウェア仕様 ###
|
||||
基本的には半蔵2.1までの機能を包含します。
|
||||
|
||||
* 使用言語 : Arduino 1.0
|
||||
|
||||
## ライセンス ##
|
||||
MIT Licence
|
||||
|
||||
---------------
|
||||
(C)2013 kou029w
|
||||
(C)2013 kou029w - MIT Licence
|
49
SerialUtil.cpp
Normal file
49
SerialUtil.cpp
Normal file
|
@ -0,0 +1,49 @@
|
|||
/*
|
||||
SerialUtil.cpp
|
||||
(C)2013 kou029w - MIT License
|
||||
*/
|
||||
|
||||
#include <Arduino.h>
|
||||
#include "SerialUtil.h"
|
||||
|
||||
template<>
|
||||
String inputLine(String str, HardwareSerial& serial);
|
||||
template<>
|
||||
String getStr(size_t size, HardwareSerial& serial);
|
||||
#ifdef __AVR_ATmega32U4__
|
||||
template<>
|
||||
String inputLine(String str, Serial_& serial);
|
||||
template<>
|
||||
String getStr(size_t size, Serial_& serial);
|
||||
#endif
|
||||
|
||||
// serialから文字列を一行('\r'まで)入力 (str:入力がないとき返す文字列)
|
||||
template<typename T>
|
||||
String inputLine(String str, T& serial){
|
||||
if(!serial) return str;
|
||||
String result = "";
|
||||
for(;;){
|
||||
if(serial.available()){
|
||||
char c = serial.read();
|
||||
if(c == '\r') break;
|
||||
result += String(c);
|
||||
}
|
||||
}
|
||||
if(result != "") return result;
|
||||
return str;
|
||||
}
|
||||
|
||||
// serialから文字列を入力
|
||||
template<typename T>
|
||||
String getStr(size_t size, T& serial){
|
||||
if(!serial) return String("");
|
||||
String str = "";
|
||||
for(size_t i = 0; i<size;){
|
||||
if(serial.available()){
|
||||
char c = serial.read();
|
||||
str.concat(String(c));
|
||||
i++;
|
||||
}
|
||||
}
|
||||
return str;
|
||||
}
|
18
SerialUtil.h
Normal file
18
SerialUtil.h
Normal file
|
@ -0,0 +1,18 @@
|
|||
/*
|
||||
SerialUtil.h - Serialから文字列を受け取るためのライブラリ
|
||||
## ライセンス ##
|
||||
(C)2013 kou029w - MIT License
|
||||
*/
|
||||
|
||||
#ifndef SerialUtil_h
|
||||
#define SerialUtil_h
|
||||
|
||||
#include <Arduino.h>
|
||||
|
||||
template<typename T>
|
||||
String inputLine(String str, T& serial);
|
||||
|
||||
template<typename T>
|
||||
String getStr(size_t size, T& serial);
|
||||
|
||||
#endif
|
122
ServoTest.cpp
Normal file
122
ServoTest.cpp
Normal file
|
@ -0,0 +1,122 @@
|
|||
/*
|
||||
ServoTest.cpp
|
||||
(C)2013 kou029w - MIT License
|
||||
*/
|
||||
|
||||
#include <Arduino.h>
|
||||
#include <Servo.h>
|
||||
#include "ServoTest.h"
|
||||
#include "SerialUtil.h"
|
||||
|
||||
//#ifdef Servo_h
|
||||
template<>
|
||||
class ServoTestClass<Servo,HardwareSerial>;
|
||||
#ifdef __AVR_ATmega32U4__
|
||||
template<>
|
||||
class ServoTestClass<Servo,Serial_>;
|
||||
#endif
|
||||
//#endif
|
||||
|
||||
template<typename SERVO, typename S>
|
||||
void ServoTestClass<SERVO,S>::_setAndPrint(SERVO& servo, const char* servoName, S& serial){
|
||||
static unsigned long lastTime;
|
||||
lastTime = _time;
|
||||
_time = millis();
|
||||
serial.print("delay(");
|
||||
serial.print(_time - lastTime);
|
||||
serial.println(");");
|
||||
|
||||
serial.print(servoName);
|
||||
switch(_mode){
|
||||
case ATTACH_MODE:
|
||||
serial.print(".attach(");
|
||||
serial.print(_val);
|
||||
servo.attach(_val);
|
||||
break;
|
||||
case DETACH_MODE:
|
||||
serial.println(".detach(");
|
||||
servo.detach();
|
||||
break;
|
||||
case WRITE_MODE:
|
||||
serial.print(".write(");
|
||||
serial.print(_val);
|
||||
servo.write(_val);
|
||||
break;
|
||||
case WRITE_MICROSEC_MODE:
|
||||
serial.print(".writeMicroseconds(");
|
||||
serial.print(_val);
|
||||
servo.writeMicroseconds(_val);
|
||||
break;
|
||||
}
|
||||
serial.println(");");
|
||||
}
|
||||
|
||||
template<typename SERVO, typename S>
|
||||
void ServoTestClass<SERVO,S>::operator()(S& serial){
|
||||
// using namespace servotest;
|
||||
char _helpdoc[] = ""
|
||||
"/*\n"
|
||||
"## help ##\n"
|
||||
"default\n"
|
||||
" Format : \"angle + 'a/b'\"\n"
|
||||
" Example: \"90a\" => servoA.write(90)\n"
|
||||
"\n"
|
||||
"[t] attach\n"
|
||||
" Format : \"'t' + pin + 'a/b'\"\n"
|
||||
" Example: \"t8b\" => servoB.attach(8)\n"
|
||||
"\n"
|
||||
"[d] detach\n"
|
||||
" Format : \"'d' + 'a/b'\"\n"
|
||||
" Example: \"db\" => servoB.detach()\n"
|
||||
"\n"
|
||||
"[u] write-microseconds\n"
|
||||
" Format : \"'u' + us + 'a/b'\"\n"
|
||||
" Example: \"u1500a\" => servoA.writeMicroseconds(1500)\n"
|
||||
"*/\n";
|
||||
_time = millis();
|
||||
SERVO _servoA;
|
||||
SERVO _servoB;
|
||||
_servoA.attach(9);
|
||||
_servoB.attach(10);
|
||||
serial.println("servoA.attach(9);");
|
||||
serial.println("servoB.attach(10);");
|
||||
|
||||
/* Main loop */
|
||||
for(;;){
|
||||
_mode = NONE;
|
||||
_val = 0;
|
||||
serial.println("/*-- [q] quit [h] help --*/");
|
||||
while(_mode == NONE){
|
||||
char c = getStr(1, serial)[0];
|
||||
switch(c){
|
||||
case 'h':
|
||||
serial.print(_helpdoc);
|
||||
break;
|
||||
case 'q':
|
||||
_servoA.detach();
|
||||
_servoB.detach();
|
||||
return;
|
||||
case 't':
|
||||
_mode = ATTACH_MODE;
|
||||
break;
|
||||
case 'd':
|
||||
_mode = DETACH_MODE;
|
||||
break;
|
||||
case 'u':
|
||||
_mode = WRITE_MICROSEC_MODE;
|
||||
break;
|
||||
case '0'...'9':
|
||||
_val = _val * 10 + c - '0';
|
||||
break;
|
||||
case 'a':
|
||||
if(_mode == NONE) _mode = WRITE_MODE;
|
||||
_setAndPrint(_servoA, "servoA", serial);
|
||||
break;
|
||||
case 'b':
|
||||
if(_mode == NONE) _mode = WRITE_MODE;
|
||||
_setAndPrint(_servoB, "servoB", serial);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
41
ServoTest.h
Normal file
41
ServoTest.h
Normal file
|
@ -0,0 +1,41 @@
|
|||
/*
|
||||
ServoTest.h - サーボの動作を確認するためのライブラリ
|
||||
|
||||
## 概要 ##
|
||||
このライブラリは、シリアルモニター上からサーボの動作を確認するためのシンプルなライブラリです。
|
||||
|
||||
## 使い方 ##
|
||||
例:
|
||||
#include <Servo.h>
|
||||
#include "ServoTest.h"
|
||||
void setup(){
|
||||
Serial.begin(9600);
|
||||
ServoTest(Serial);
|
||||
}
|
||||
void loop(){
|
||||
}
|
||||
|
||||
## ライセンス ##
|
||||
(C)2013 kou029w - MIT License
|
||||
*/
|
||||
|
||||
#ifndef ServoTest_h
|
||||
#define ServoTest_h
|
||||
|
||||
#include <Arduino.h>
|
||||
#include <Servo.h>
|
||||
#include "SerialUtil.h"
|
||||
|
||||
template<typename SERVO, typename S>
|
||||
class ServoTestClass{
|
||||
public:
|
||||
void operator()(S& serial);
|
||||
private:
|
||||
void _setAndPrint(SERVO& servo, const char* servoName, S& serial);
|
||||
enum mode_e {ATTACH_MODE, DETACH_MODE, WRITE_MODE, WRITE_MICROSEC_MODE, NONE} _mode;
|
||||
unsigned long _time;
|
||||
int _val;
|
||||
char* _helpdoc;
|
||||
};
|
||||
|
||||
#endif
|
21
hanzo3.ino
21
hanzo3.ino
|
@ -1 +1,22 @@
|
|||
/*
|
||||
競技用ランサーロボット
|
||||
半蔵 3.0
|
||||
(C)2013 kou029w - MIT License
|
||||
*/
|
||||
#include <Servo.h>
|
||||
#include "ServoTest.h"
|
||||
//#include "SerialUtil.h"
|
||||
|
||||
#ifdef __AVR_ATmega32U4__
|
||||
ServoTestClass<Servo,Serial_> ServoTest;
|
||||
#else
|
||||
ServoTestClass<Servo,HardwareSerial> ServoTest;
|
||||
#endif
|
||||
|
||||
void setup(){
|
||||
Serial.begin(9600);
|
||||
ServoTest(Serial);
|
||||
}
|
||||
|
||||
void loop(){
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue