-
はにゃさんつきさん
mikalhart さんの LiquidCrytal ライブラリ
https://github.com/mikalhart/galileo-LiquidCrystal/releases/
の write4bits() は既に書き換えられています。
LCDシールドを持っていないので検証できないのですが、もう少し早くなるような気がしなくもないです。
void LiquidCrystal::write4bits(uint8_t value) {
for (int i = 0; i < 4; i++) {
/* No need to set pinMode every time a character is drawn
pinMode(_data_pins[i], OUTPUT);
*/
digitalWrite(_data_pins[i], (value >> i) & 0x01);
}
pulseEnable();
}2014/03/06
-
つきさんはにゃ さん
ありがとうございます。
試してみました。
倍速くらいにはなりました。
だたし、そこ1か所の変更では表示しなくなります。
多分、最初の送信の時にポート設定してあげなくてはいけないと思うので、、、
ちょっと横着して、コマンド送信の時はポート設定するようにしました。
比較の動画も置いておきました。
2014/03/06
-
はにゃさんつきさん
確認ありがとうございます。
なお、LCDシールドではできませんが、 D2ピン,D3ピンに限定すれば、
pinMode(...,OUTPUT_FAST);
が使用できます。
というのも、D2ピン,D3ピンは 多重化されていて、
pinMode(...,OUTPUT) では I2C標準モード接続の Cypress I/O Port Expander、
pinMode(...,OUTPUT_FAST) では SoC側 GPIOが接続されて高速出力されるのです。
wiring_digital.c の pinMode関数をみると、
OUTPUT_FASTが指定されると、
hardware/arduino/x86/variants/galileo_fab_d/variant.cppの
variantEnableFastGpio() をコールして、Muxを切り替えているようです。
なお、INPUT_FAST は使うなという指示がfast_gpio_sc.c ソースコードにあります。
ここまでは回路図他とソースを睨めっこして分かってたのですが、
https://communities.intel.com/message/207904
に、
出力関数ごとに速度が示されていて
digitalWrite() で 477kHz,
fastGpioDigitalWrite() で 680kHz
fastGpioDigitalWriteDestructive() で 2.93MHz
の波形出力ができることがしめされています。2014/03/06
-
つきさんはにゃ さん
情報ありがとうございます。
シールドを自作する場合は接続が自由なので高速のピンが使えますね。
既製品だと改造することになります。お手軽がウリのArduinoから離れていく、、、2014/03/06
-
つきさんグラフィック液晶 LCD4884 シールドの表示に成功しました。
画面のクリアに非常に時間がかって動いているのかわからないくらいです。
そんな時は、の埋める値(パターン)を変えてみましょう。
void LCD4884::LCD_clear(void)
AVR用の、タイマ割り込みを置き換えることと、フォントパターンを取ってくる関数(pgm_read_byte)の定義が胆でした。
表示ができたのはいいですが、遅すぎて使えない状況です。システム構成を変更するか、
への乗り換えも検討した方がよさそうです。2014/03/09
-
ヒロ妨さん此方のモーターシールドは、裏面のVinショートジャンパーをカットして、別電源を接続して
動作させたら、大丈夫でした。
テスト用スケッチ
#define PORT_DIR_A 12
#define PORT_DIR_B 13
#define PORT_PWM_A 3
#define PORT_PWM_B 11
#define PORT_BRAKE_A 9
#define PORT_BRAKE_B 8
#define PORT_CURRENTSENSE_A A0
#define PORT_CURRENTSENSE_B A1
void controlMotor(boolean motor_r_fwd,boolean motor_l_fwd,byte motor_r_power,byte motor_l_power);
void setup()
{
// ポートの初期設定を行う
pinMode(PORT_DIR_A,OUTPUT);
pinMode(PORT_DIR_B,OUTPUT);
pinMode(PORT_PWM_A,OUTPUT);
pinMode(PORT_PWM_B,OUTPUT);
pinMode(PORT_BRAKE_A,OUTPUT);
pinMode(PORT_BRAKE_B,OUTPUT);
digitalWrite(PORT_DIR_A,LOW);
digitalWrite(PORT_DIR_B,LOW);
digitalWrite(PORT_BRAKE_A,LOW);
digitalWrite(PORT_BRAKE_B,LOW);
analogWrite(PORT_PWM_A,0);
analogWrite(PORT_PWM_B,0);
}
void loop()
{
// モーターを駆動
controlMotor(true,true,255,255);
// 3秒待つ
delay(3000);
// モーターを駆動
controlMotor(false,false,255,255);
// 3秒待つ
delay(3000);
}
void controlMotor(boolean motor_r_fwd,boolean motor_l_fwd,byte motor_r_power,byte motor_l_power)
{
if(motor_r_power == 0){
digitalWrite(PORT_BRAKE_A,HIGH);
}
else {
digitalWrite(PORT_BRAKE_A,LOW);
}
if(motor_l_power == 0){
digitalWrite(PORT_BRAKE_B,HIGH);
}
else {
digitalWrite(PORT_BRAKE_B,LOW);
}
digitalWrite(PORT_DIR_A,motor_r_fwd == false ? HIGH : LOW);
digitalWrite(PORT_DIR_B,motor_l_fwd == false ? HIGH : LOW);
analogWrite(PORT_PWM_A,motor_r_power);
analogWrite(PORT_PWM_B,motor_l_power);
}2014/03/22
-
いぐなっちさんCPU温度が70度を超えると、スケッチが強制終了します。
そよ風程度でも風をあてるだけで、60度まで低下、安定動作します。
ヒートシンク(2cm角)を取り付ければ、さらに冷え冷えで、43度まで下がりました。
高負荷のスケッチを常時稼動させるなら、ヒートシンクとDCファンは欲しいですね。2014/04/03
周辺機器動作報告・相談所
認識が出来たSDカード、出来なかったカード。
公式サイトにはないけど、動作したシールド。
完全ではないけど、何となく動くシールド。
このパーツ動くの?このパーツ動いたよ!みんなで報告・相談!