So-net無料ブログ作成
ロボット・ドローンを作ってみる! ブログトップ
前の10件 | -

SPRESENSE と BMI160アドオンボードで傾きを測ってみた!(1) [ロボット・ドローンを作ってみる!]

前回、SPRESENSEでモーターの回転数を測ってみました。今回は、スイッチサイエンスから出ている BMI160アドオンボードを使って、倒立振子の車体の傾きを検出してみたいと思います。


SPRESENSE用3軸加速度・3軸ジャイロ・気圧・温度センサ アドオンボード BMP280 BMI160搭載
https://www.switch-science.com/catalog/5258/


このボードはジャイロと加速度センサーが搭載されています。今回はそれぞれのセンサーで出力される値を比較してみたいと思います。加速度センサーとジャイロセンサーの座標軸は次のようになっています。


加速度センサーの座標軸

スライド1.png

ジャイロセンサーの座標軸

スライド2.png


ジャイロセンサーからは角加速度が出力されますので、角度は時間積分で求まります。

\[
\theta = \int_{0}^{t} \omega(t) \, dt
\]

加速度センサーで角度を出すには、重力を使います。重力加速度は常に下向きになりますので、角度は例えばZ成分とY成分のatan で求まります。プログラミング時は角度とラジアンの単位の違いに注意してください。

スライド3.png


あともう一点、注意しないといけないのは、置いた場所が水平とは限らないことです。何もしないと各軸への重力影響が取り除けず正しい角度が算出できません。開始時に各軸の重力加速度を計測をしておき、制御時はその影響を取り除く必要があります。(プログラム中では"Calibration"と呼んでいます)

これらのことを踏まえて、次のようなスケッチを書いてみました。

#include <Wire.h>
#include <math.h>
#include <BMI160Gen.>

#define BAUDRATE  115200
#define SENSE_RATE   200
#define GYRO_RANGE   250
#define ACCL_RANGE     2

#define COUNT_FOR_CALIB 1024

#define deg_to_rad(a) (a/180*M_PI)
#define rad_to_deg(a) (a/M_PI*180)

#define PRINT_ACCL
#define PRINT_GYRO
// #define PRINT_YAW

uint16_t adjust_usec;
static float calib_accel_x = 0, calib_accel_y = 0, calib_accel_z = 0;   

float convertRawGyro(int gRaw) 
{
  // ex) if the range is +/-500 deg/s: +/-32768/500 = +/-65.536 LSB/(deg/s)
  float lsb_omega = float(0x7FFF) / GYRO_RANGE;
  return gRaw / lsb_omega;  // deg/sec
}

float convertRawAccel(int aRaw) 
{
  // ex) if the range is +/-2g ; +/-32768/2 = +/-16384 LSB/g
  float lsb_g = float(0x7FFF) / ACCL_RANGE;
  return aRaw / lsb_g;
}

void print_pitch_roll() 
{

  static uint16_t n = 0;
  static float g_angle_roll = 0, g_angle_pitch = 0, g_angle_yaw = 0;
  static float a_angle_roll = 0, a_angle_pitch = 0, a_angle_yaw = 0;      
 
  static unsigned long last_mills = 0; 
  
  // read raw gyro measurements from device
  int rawRoll, rawPitch, rawYaw; // roll, pitch, yaw
  BMI160.readGyro(rawRoll, rawPitch, rawYaw);
  
  // read raw accl measurements from device
  int rawXAcc, rawYAcc, rawZAcc; // x, y, z
  BMI160.readAccelerometer(rawXAcc, rawYAcc, rawZAcc);

  unsigned long cur_mills = millis();
  unsigned long duration = cur_mills - last_mills;
  last_mills = cur_mills;
  float fduration = duration / 1000.0; // ms->s
  
  // convert the raw gyro data to degrees/second
  float omega_roll  = convertRawGyro(rawRoll);
  float omega_pitch = convertRawGyro(rawPitch);
  float omega_yaw   = convertRawGyro(rawYaw);
  
  g_angle_roll  += omega_roll  * fduration; // (ms->s) omega x time = degree
  g_angle_pitch += omega_pitch * fduration;
  g_angle_yaw   += omega_yaw   * fduration; // for the reference

  // convert the raw acclerometer data to m/s^2
  float cur_a_x = convertRawAccel(rawXAcc) - calib_accel_x;
  float cur_a_y = convertRawAccel(rawYAcc) - calib_accel_y;
  float cur_a_z = convertRawAccel(rawZAcc) - calib_accel_z;
  cur_a_x = deg_to_rad(cur_a_x);
  cur_a_y = deg_to_rad(cur_a_y);
  cur_a_z = deg_to_rad(cur_a_z);
  a_angle_roll = atan(cur_a_y / cur_a_z);
  a_angle_pitch = atan(-cur_a_x / cur_a_z);
  a_angle_roll = rad_to_deg(a_angle_roll);
  a_angle_pitch = rad_to_deg(a_angle_pitch);
  
   
#ifdef PRINT_GYRO 
  // Serial.print("Duration:");
  // Serial.print(duration);
  // Serial.print(",");
  Serial.print("GYRO_roll:");
  Serial.print(g_angle_roll);
  Serial.print(",");
  Serial.print("GYRO_pitch:");
  Serial.print(g_angle_pitch);
  Serial.print(",");
#ifdef PRINT_YAW
  Serial.print("GYRO_yaw:");
  Serial.print(g_angle_yaw);
  Serial.print(",");
#endif
#endif

  // display tab-separated accel x/y/z values
#ifdef PRINT_ACCL
  Serial.print("ACC_roll:");
  Serial.print(a_angle_roll);
  Serial.print(",");
  Serial.print("ACC_pitch:");
  Serial.print(a_angle_pitch);
#endif

  Serial.println();
  usleep(adjust_usec); // 2msec is the process time for displaying the values.
}


void setup() {
  Serial.begin(BAUDRATE);

  BMI160.begin(BMI160GenClass::I2C_MODE);

  BMI160.setGyroRate(SENSE_RATE);
  BMI160.setAccelerometerRate(SENSE_RATE);
  BMI160.setGyroRange(GYRO_RANGE);
  BMI160.setAccelerometerRange(ACCL_RANGE);

  BMI160.autoCalibrateGyroOffset();
  BMI160.autoCalibrateAccelerometerOffset(X_AXIS, 0);
  BMI160.autoCalibrateAccelerometerOffset(Y_AXIS, 0);
  BMI160.autoCalibrateAccelerometerOffset(Z_AXIS, 1);

  // Serial.println("Calibrating...");
  unsigned long sampling_rate = 1000 / SENSE_RATE;

  // Calcurate offset
  for (int i = 0; i < COUNT_FOR_CALIB; ++i) {
    int xAcc, yAcc, zAcc;
    BMI160.readAccelerometer(xAcc, yAcc, zAcc);
    calib_accel_x += convertRawAccel(xAcc);
    calib_accel_y += convertRawAccel(yAcc);
    calib_accel_z += convertRawAccel(zAcc)-1.0;
  }
  
  // mean value
  calib_accel_x /= COUNT_FOR_CALIB;
  calib_accel_y /= COUNT_FOR_CALIB;
  calib_accel_z /= COUNT_FOR_CALIB;
  
  calib_accel_z *= 1000; // The offset supports +/-495.3(mg)
  Serial.println("calib_a_x:" + String(calib_accel_x, 3));
  Serial.println("calib_a_y:" + String(calib_accel_y, 3));
  Serial.println("calib_a_z:" + String(calib_accel_z, 3));

  // SENSE_RATE is Hz and 2 millsec is the process time for this sketch
  adjust_usec = (1000/SENSE_RATE - 2) * 1000; 
  digitalWrite(LED0, HIGH);
}

void loop() {
  print_pitch_roll(); 
}



このスケッチで計測した結果がこちらです。


2020-05-07.png


ジャイロの変化は非常に滑らかなのに対し、加速度センサーはノイズが多いです。一方、ジャイロは"gyro_roll"の最後にオフセットがかかってしまっていますが、加速度センサーはその影響はなさそうです。(拡大して見ると"gyro_pitch"もオフセットを持ってしまっているようです)

どちらも一長一短ですね。この2つのセンサーの特長をうまく利用するために、次はフィルター処理を試してみたいと思います。😀
(^^)/~






SONY SPRESENSE メインボード CXD5602PWBMAIN1

SONY SPRESENSE メインボード CXD5602PWBMAIN1

  • 出版社/メーカー: スプレッセンス(Spresense)
  • メディア: Tools & Hardware



ROHM センサAdd-onボード SPRESENSE-SENSOR-EVK-701

ROHM センサAdd-onボード SPRESENSE-SENSOR-EVK-701

  • 出版社/メーカー: ローム(ROHM)
  • メディア: Tools & Hardware







nice!(25)  コメント(0) 
共通テーマ:趣味・カルチャー

SPRESENSE用モータードライバ・アドオンボードを作ってみた(2) [ロボット・ドローンを作ってみる!]

自作 SPRESENSE用モータードライバ・アドオンボード の試運転をしてみました。少し前に制作した倒立振り子の筐体に取り付けて二つのモーターを駆動してみます。


DSC01910s.JPG


アドオンボードの仕様を再掲します。


MotorAddOnFront.JPG


SpresenseMotorAddOn.JPG


使用したスケッチは次のような単純なものです。

#define AIN01 21
#define AIN02 20
#define AIN11 19
#define AIN12 18
#define DELAY 3000
#define DASH 5


void motor_drive(uint8_t i, bool cw) {
#ifdef DASH
  if (cw) {
    analogWrite(AIN01, 255);
    analogWrite(AIN02, 0);
    analogWrite(AIN11, 255);
    analogWrite(AIN12, 0);
  }  else  {
    analogWrite(AIN01, 0);
    analogWrite(AIN02, 255);
    analogWrite(AIN11, 0);
    analogWrite(AIN12, 255);
  }
  delay(DASH);
#endif
  if (cw) {
    analogWrite(AIN01, i);
    analogWrite(AIN02, 0);
    analogWrite(AIN11, i);
    analogWrite(AIN12, 0);

  } else {
    analogWrite(AIN01, 0);
    analogWrite(AIN02, i);
    analogWrite(AIN11, 0);
    analogWrite(AIN12, i);
  }
  Serial.println(i);
  delay(DELAY);  
}

void setup() {
  Serial.begin(115200);
}

void loop() {
  int i;

  for (i = 0; i <= 250; i+=10) {
    motor_drive(i, true);
  }

  for (i = 250; i >= 0; i-=10) {
    motor_drive(i, true);
  }

  for (i = 0; i <= 250; i+=10) {
    motor_drive(i, false);
  }

  for (i = 250; i >= 0; i-=10) {
    motor_drive(i, false);
  }

  while(1);
}



百聞は一見にしかずということで、実際の動作は動画でどうぞ。(^-^)







SONY SPRESENSE メインボード CXD5602PWBMAIN1

SONY SPRESENSE メインボード CXD5602PWBMAIN1

  • 出版社/メーカー: スプレッセンス(Spresense)
  • メディア: Tools & Hardware






ROHM センサAdd-onボード SPRESENSE-SENSOR-EVK-701

ROHM センサAdd-onボード SPRESENSE-SENSOR-EVK-701

  • 出版社/メーカー: ローム(ROHM)
  • メディア: Tools & Hardware





nice!(25)  コメント(0) 
共通テーマ:趣味・カルチャー

SPRESENSE用モータードライバ・アドオンボードを作ってみた(1) [ロボット・ドローンを作ってみる!]

SPRESENSEメインボードだけで、2つのモーターを駆動できることが分かったのでアドオンボードを作ってみました。センサーアドオンボードとの共存もできるようになっています。


SpresenseMotorAddOn.JPG


モータードライバには、DRV8835を使っています。秋月電子で入手できます。


DRV8835.png
http://akizukidenshi.com/download/ds/akizuki/AE-DRV8835-Ss.pdf


回路は極めてシンプルです。電源系の引き回しが少しやっかいですが、ほとんどはピンをそのまま出しているだけです。(ハンダが下手くそで、お恥ずかしい)


MotorAddOnFront.JPG


裏面は少しゴミゴミしています。モーター出力端子を100kΩでプルダウンしているためです。これは必ずしも必要はないですが、モーター出力の波形を見ると抵抗でプルダウンをしたほうが一番効率がよさそうなので、少しがんばってハンダ付けしました。


MotorAddOnBack.JPG


次は前回作った倒立振子のメカに搭載してモーターを動かしてみたいと思います!
( ・ิω・ิ)/





SONY SPRESENSE メインボード CXD5602PWBMAIN1

SONY SPRESENSE メインボード CXD5602PWBMAIN1

  • 出版社/メーカー: スプレッセンス(Spresense)
  • メディア: Tools & Hardware



HiLetgo 3pcs DRV8833デュアルモータードライバー

HiLetgo 3pcs DRV8833デュアルモータードライバー

  • 出版社/メーカー: HiLetgo
  • メディア: おもちゃ&ホビー



倒立振子制御学習用ロボット ビュートバランサー2 [学習教材] [vstone]

倒立振子制御学習用ロボット ビュートバランサー2 [学習教材] [vstone]

  • 出版社/メーカー: Vstone(ヴイストン株式会社)
  • メディア:





nice!(29)  コメント(0) 
共通テーマ:趣味・カルチャー

倒立振子用のSPRESENSEフォルダーをデザインしてみた! [ロボット・ドローンを作ってみる!]

久しぶりに3DCADを使って、SPRESENSEとバッテリーを載せるためのフォルダーをデザインしてみました。真ん中はフォルダで左右にあるのはバッテリを格納するためのフォルダーです。


フォルダー.png


久しぶりの割にはなかなかの出来です。これを我が家のポンコツ3Dプリンターで出力して、ギヤモーターに装着してみました。


DSC_0959.JPG


おお、想像以上にかっこよく出来ました。しかし、このサイズに収めるにはモータードライバをSPRESENSEのアドオンボードにする必要があります。

次は、がんばって2つのモーターを駆動できるアドオンボードを設計してみたいと思います!!
( ・ิω・ิ)






Fusion360操作ガイド ベーシック編 2020年版―次世代クラウドベース3DCAD

Fusion360操作ガイド ベーシック編 2020年版―次世代クラウドベース3DCAD

  • 作者: 三谷 大暁
  • 出版社/メーカー: カットシステム
  • 発売日: 2020/01/01
  • メディア: 単行本



キットではじめる3Dプリンタ自作入門

キットではじめる3Dプリンタ自作入門

  • 作者: 吹田智章
  • 出版社/メーカー: ラトルズ
  • 発売日: 2019/12/25
  • メディア: 単行本







nice!(27)  コメント(0) 
共通テーマ:趣味・カルチャー

SPRESENSEで2つのモーターを制御してみた [ロボット・ドローンを作ってみる!]

SPRESENSEで倒立振子を作ってみようかと思い、2つのモーターを制御してみました。ジャイロセンサーには、スイッチサイエンスのBMI160搭載されたSPRESENSE用アドオンボードを使う予定です。


sDSC01856.jpg


BMI160のライブラリは、次のGitHubからダウンロードして使っています。サンプルが少ないので使いこなすには、自分でソースを読み解く必要がありそうです。


hanyazou/BMI160-Arduino
https://github.com/hanyazou/BMI160-Arduino



次のようなスケッチを書いてBMI160とモーターの動作を確認をしてみました。電圧が低い状態だとトルク不足で車輪が回らないので、駆動時の頭で車輪が回らない程度の短い時間トルクをフルでかけて車輪を回す工夫をしています。(十分な出力容量がある電池なら不要かもしれません)


#include <Wire.h>
#include <BMI160Gen.h>

#define AIN01 25
#define AIN02 26
#define AIN11 18
#define AIN12 19
#define DELAY 3000
#define DASH 5


float convertRawGyro(int gRaw) {
  // since we are using 250 degrees/seconds range
  // -250 maps to a raw value of -32768
  // +250 maps to a raw value of 32767

  float g = (gRaw * 250.0) / 32768.0;
  return g;
}


void print_gyro() {
  int gxRaw, gyRaw, gzRaw;         // raw gyro values
  float gx, gy, gz;

  // read raw gyro measurements from device
  BMI160.readGyro(gxRaw, gyRaw, gzRaw);

  // convert the raw gyro data to degrees/second
  gx = convertRawGyro(gxRaw);
  gy = convertRawGyro(gyRaw);
  gz = convertRawGyro(gzRaw);

  // display tab-separated gyro x/y/z values
  Serial.print("g:\t");
  Serial.print(gx);
  Serial.print("\t");
  Serial.print(gy);
  Serial.print("\t");
  Serial.print(gz);
  Serial.println();

  delay(500);  
}

void motor_drive(uint8_t i, bool cw) {
#ifdef DASH
  if (cw) {
    analogWrite(AIN01, 255);
    analogWrite(AIN02, 0);
    analogWrite(AIN11, 255);
    analogWrite(AIN12, 0);
  }  else  {
    analogWrite(AIN01, 0);
    analogWrite(AIN02, 255);
    analogWrite(AIN11, 0);
    analogWrite(AIN12, 255);
  }
  delay(DASH);
#endif
  int n = i*ADJUST;
  if (cw) {
    analogWrite(AIN01, i);
    analogWrite(AIN02, 0);
    analogWrite(AIN11, i);
    analogWrite(AIN12, 0);

  } else {
    analogWrite(AIN01, 0);
    analogWrite(AIN02, i);
    analogWrite(AIN11, 0);
    analogWrite(AIN12, i);
  }
  Serial.println(i);
  delay(DELAY);  
}

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  BMI160.begin(BMI160GenClass::I2C_MODE);
  uint8_t dev_id = BMI160.getDeviceID();
  Serial.print("DEVICE ID: ");
  Serial.println(dev_id, HEX);  
  BMI160.setGyroRange(250);
  Serial.println("Initializing IMU device...done.");
}

void loop() {
  int i;

  for (i = 0; i <= 250; i+=10) {
    motor_drive(i, true);
    print_gyro();
  }

  for (i = 250; i >= 0; i-=10) {
    motor_drive(i, true);
    print_gyro();
  }

  for (i = 0; i <= 250; i+=10) {
    motor_drive(i, false);
    print_gyro();
  }

  for (i = 250; i >= 0; i-=10) {
    motor_drive(i, false);
    print_gyro();
  }

  while(1);

}



どうも左右のモーターの特性が異なるようで、回転数に明らかな差がでてしまっています。モーターはアナログなものなので特性に差が出るのは仕方ないけど、倒立振子がきちんと動くのか心配です。

その前に、これらのパーツを組み上げるための台を3Dプリンタでデザインしないと…。久しぶりのCAD使えるかな。
(ー'`ー;)





SONY SPRESENSE メインボード CXD5602PWBMAIN1

SONY SPRESENSE メインボード CXD5602PWBMAIN1

  • 出版社/メーカー: スプレッセンス(Spresense)
  • メディア: Tools & Hardware



Tenflyer  6軸レートジャイロBMI160 6Dof重力加速度センサーモジュール

Tenflyer  6軸レートジャイロBMI160 6Dof重力加速度センサーモジュール

  • 出版社/メーカー: Tenflyer
  • メディア: ホーム&キッチン



HiLetgo 3pcs DRV8833デュアルモータードライバー

HiLetgo 3pcs DRV8833デュアルモータードライバー

  • 出版社/メーカー: HiLetgo
  • メディア: おもちゃ&ホビー




nice!(25)  コメント(2) 
共通テーマ:趣味・カルチャー

SPRESENSE メインボードでDCモータを動かしてみた(電流編)! [ロボット・ドローンを作ってみる!]

SPRESENSE メインボードのみでモータを動かす実験を行いましたが、前回はオシロスコープを使って電圧の挙動を見てみました。で、流れる電流値に違いはあるかなと思い電流の値を見てみることにしました。


DSC_0926.JPG


前回の繰り返しになりますが、使用したモータードライバはTI社のDRV8835です。


DRV8835.png


精度の高い電流計はないので、いつものように市販のテスターを使って電流値を測ります。信頼性はあまりないので、大体の傾向を見るくらいで見てみてください。

測定環境は、前回と同じく次の3条件です。モーターには負荷をつけていません。


(1)モータードライバ DRV8835 の出力から直接DCモーターに接続した場合

スライド5.PNG


(2)モータードライバ DRV8835 の出力に1000pFのコンデンサをつけた場合

スライド6.PNG


(3)モータードライバ DRV8835 の出力に100kΩの抵抗をつけた場合

スライド7.PNG

結果は次のようになりました。横軸が analogWrite の出力値(PWM)、縦軸が電流値(A)です。


DRV8835motor.png

ほとんど傾向に変わりはありませんが、(1)の場合は流れる電流がばたつく感じでした。やはり電圧差が不安定なためでしょうか。(2),(3)はあまり有意な差はなさそうです。



細かい制御をしたい場合は、(1)は避けたほうがよさそうです。
( ̄ ~  ̄;)


関連記事
SPRESENSE メインボードでDCモータを動かしてみた!
https://makers-with-myson.blog.ss-blog.jp/2020-03-08





SONY SPRESENSE メインボード CXD5602PWBMAIN1

SONY SPRESENSE メインボード CXD5602PWBMAIN1

  • 出版社/メーカー: スプレッセンス(Spresense)
  • メディア: Tools & Hardware



HiLetgo 3pcs DRV8833デュアルモータードライバー

HiLetgo 3pcs DRV8833デュアルモータードライバー

  • 出版社/メーカー: HiLetgo
  • メディア: おもちゃ&ホビー







nice!(24)  コメント(0) 
共通テーマ:趣味・カルチャー

SPRESENSE メインボードでDCモータを動かしてみた! [ロボット・ドローンを作ってみる!]

以前からSPRESENSEのマルチコアで制御をやってみたいなと思い、はじめの一歩としてDCモータを動かしてみました。せっかくなら小型化したいので、メインボードのみでDCモータを動かせるモータドライバを探してみました。


DSC01723.JPG


いろいろ探したところ、ロジック電源が2V(メインボードは1.8Vなので少しスペック割れですが)のDRV8835を使ってみることにしました。(秋月電子で購入しました)


DRV8835.png


回路は次のようにしてみました。


スライド1.PNG


テスト用のスケッチは次のような単純なものです。

#define AIN1 14
#define AIN2 15

void setup() {
  // put your setup code here, to run once:
}

void loop() {
  int i;

  for (i = 0; i <= 255; ++i) {
    analogWrite(AIN1, i);
    analogWrite(AIN2, 0);
    delay(100);
  }

  for (; i >= 0; --i) {
    analogWrite(AIN1, i);
    analogWrite(AIN2, 0);
    delay(100);
  }

  for (i = 0; i <= 255; ++i) {
    analogWrite(AIN1, 0);
    analogWrite(AIN2, i);
    delay(100);
  }

  for (; i >= 0; --i) {
    analogWrite(AIN1, 0);
    analogWrite(AIN2, i);
    delay(100);
  }

  while(1);

}




実際に組み上げた様子がこちら。


2020-03-08.png


波形を見てみると、モーター駆動待機状態でフラットになっていません。モーターに若干のブレーキがかかっている可能性があります。


2020-03-08 (3).png


ということで、キャパシタンスを追加してみることにしました。


スライド2.PNG


実際に組み上げた様子がこちら。


2020-03-08 (1).png


波形を見てみると、電圧がLOWになっていません。モーターを動かす前の段階でモーターにブレーキがかかってしまっています。


2020-03-08 (4).png


次は、電圧をグランドに引っ張ることを考えてみました。で、100kΩの抵抗をつけてみました。


スライド3.PNG


実際に組み上げた様子がこちら。


2020-03-08 (2).png


波形を見てみると、期待通り電圧がLOWになっています。モーターを動かす前の段階でフリーランになっているので、モーターに負担はかかっていないように見えます。


2020-03-08 (5).png


とは言うものの、どの方式が一番トルクが出ているは実際に測ってみないとわかりません。どうやって測ってみようかなぁ。
(。-`ω´-)


お時間のある方は動画もどうぞ。









SONY SPRESENSE メインボード CXD5602PWBMAIN1

SONY SPRESENSE メインボード CXD5602PWBMAIN1

  • 出版社/メーカー: スプレッセンス(Spresense)
  • メディア: Tools & Hardware






最新版 モータ技術のすべてがわかる本 (史上最強カラー図解)

最新版 モータ技術のすべてがわかる本 (史上最強カラー図解)

  • 作者: 赤津 観
  • 出版社/メーカー: ナツメ社
  • 発売日: 2012/09/04
  • メディア: 単行本




nice!(19)  コメント(0) 
共通テーマ:趣味・カルチャー

ボール型ヘリコプター玩具の電子部品を解析してみた! [ロボット・ドローンを作ってみる!]

ボール型ヘリコプター玩具の解析をすすめるために、モーターとバッテリーを取り外しました。解析している間に、万が一ショート等したら怖いですからね。


DSC04940.JPG


解析がしやすいように裏面に端子が出ている部品からワイヤーを這わせました。ワイヤーを取り付けるだけなのですが、細かい作業なので、とっても肩が凝ります。(´・ω・`)


DSC04942.JPG


部品名の刻印があるものについては、多くの場合インターネットにデータシートが転がっているので、それがヒントになります。


DSC04948.JPG


モータードライバらしきものについては、「A2SHB」と読めます。


A2SHB.jpg


ググってみると、すぐに見つかりました!想像していたとおり FET のようです。


N-Channel Enhancement Mode Power MOSFET
https://www.mikrocontroller.net/attachment/212878/HM2302A.PDF


もうひとつバッテリーチャージャーらしきものは、「40548」もしくは「4054B」でしょうか。


4054B.jpg


なかなか見つけることができずに、あきらめかけていたところで、ようやく以下のサイトを発見!


800mA Standalone Linear Li-Ion Battery Charger
http://www.belling.com.cn/media/file_object/bel_product/BL4054B/datasheet/BL4054_V1.4_en.pdf


こちらも想像どおりバッテリーチャージャーのようです。

赤外線出力ポートと、赤外線センサー、マイコンらしきものは残念ながら型番分からず。解析はまだまだ続きます!
( ー`дー´)b















nice!(25)  コメント(0) 
共通テーマ:趣味・カルチャー

ボール型ヘリコプター玩具を分解してみた! [ロボット・ドローンを作ってみる!]

興味本位で買ってみたボール型ヘリコプター。今回はそれを分解してみました!


DSC04931.JPG


裏面はこんな感じ。配線はかなりシンプル。バッテリーとモーターがワイヤーで接続されています。


DSC04932.JPG


バッテリーを抜き出してみると、どうも 75mAh の 3.7V LiPoバッテリーのようです。


DSC04934.JPG


プロペラの駆動部はこんな感じ。ギア比を変えてプロペラの回転速度とトルクを調整しているようです。このあたりの設計ができるようになると楽しいだろうなぁ。


DSC04936.JPG


基板をよく眺めてみると、おや?これは赤外線センサーでは???


DSC04937.JPG


外観から解析しただけですが、モータードライバと思っていたのは、どうやらマイコンのようです。謎の端子があったのですが、それはプログラム書き込み用の端子のようですね。その後の調査で、プログラム書き込み用端子と思われたものは赤外線出力ポートでした。なので赤外線で距離を測定しているようですね。


DSC04938.JPG


大分見通しがよくなってきました。あとは配線をじっくりと観察して、信号を通してみて予測があたっているか確認してみたいと思います。
(^^)/~















nice!(31)  コメント(2) 
共通テーマ:趣味・カルチャー

ボール型ヘリコプター玩具を買ってみた! [ロボット・ドローンを作ってみる!]

グーグルで面白そうな小型ドローンがないかなと探していたら、ボール型ヘリコプターのおもちゃが売ってました。安かったし、ちょっと面白そうなので買ってみました。


0_BallHelicopter.jpg


しかし、中国製なので例によって説明書も何もありません。どうやって操作してよいのかよく分かりません。ググってようやく分かりました。どうも手(静電気?)に反応して上下をコントロールするみたいです。





困ったことにこれを手にとろうとすると、反応して上にあがってしまうのでなかなか取れない。なので仕方なく紐をつけて飛ばしています。

だいたい動作は分かったので解体してみました。部品は非常に簡素です。


1_BallHelicopter.jpg


モータードライバらしきものとバッテリチャージャーらしきものは確認できました。静電気を検出してモーターの推力を変える部分がよく分かりません。引き続き解析してみたいと思います。
(^^)/~















nice!(34)  コメント(5) 
共通テーマ:趣味・カルチャー
前の10件 | - ロボット・ドローンを作ってみる! ブログトップ