This commit is contained in:
Nebel 2013-02-26 00:35:19 +09:00
parent 0ced1effbd
commit 5d38cab413
10 changed files with 468 additions and 21 deletions

34
DigitalReadSerialX8.cpp Normal file
View 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
View 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
View 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
View file

@ -0,0 +1,75 @@
/*
Motor.h - (1/2)
## 概要 ##
12
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

View file

@ -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
View 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
View 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
View 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
View 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

View file

@ -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(){
}