マトリックスLEDキットの使い方(mbed LPC1768編)

好評発売中のマトリックスLEDキットの使い方です。このページではmbed LPC1768での使い方を説明します。

準備

 マトリックスLEDキットの内容

  • 8x8マトリックスLED × 1個
  • 100Ω抵抗(茶黒茶 金) × 10本 (この内8本を使います。2本は予備です)
  • 0Ω抵抗(黒帯1本のみ) × 10本 (この内8本を使います。2本は予備です)
  • ブレッドボード × 2個
  • ジャンパワイヤ(オス−オス)赤 × 4本
  • ジャンパワイヤ(オス−オス)緑 × 4本
  • ジャンパワイヤ(オス−オス)青 × 4本
  • ジャンパワイヤ(オス−オス)白 × 4本
  • ジャンパワイヤ(オス−オス)黒 × 4本 (これは予備になります。今回は使いません)

 キットの他に用意するもの

  • mbed LPC1768
  • USBケーブル(A-miniB)  ※上記mbed LPC1768に1本付属しています。
  • mbed LPC1768を載せるためのブレッドボード × 1個
  • Windows/mac OS/LinuxなどのUSBマスストレージに書込みが出来てWebブラウザを搭載したパソコン
  • インターネット接続環境(mbedはブラウザによるオンライン開発が基本です)

 有ると便利なもの

組み立て方

  1. ブレッドボードを横に連結します。 R1135264_1024
  2. 8x8マトリックスLED をブレッドボードに挿します。LEDの1と書かれた(赤丸)側に 1番ピン(緑丸)が有るので、左側ブレッドボードのj-11に入る様に挿し込んで下さい。(青丸の並び) R1135263_1024
  3. 抵抗(100Ω × 8本、0Ω × 8本)の足を幅400mil(ブレッドボードの穴5つにまたがる長さ)に曲げます。 ワイヤーストリッピングゲージの5の所を使うと綺麗に曲げられます。 (合わせて抵抗の足を曲げた所から7〜8mm程度にニッパで短くカットしておくと綺麗に仕上がります) R1135265_1024
  4. 抵抗をブレッドボードに挿し込みます。(抵抗に向きはありません)
    • 左ブレッドボード d-11からf-11
    • 左ブレッドボード d-12からf-12
    • 左ブレッドボード d-13からf-13へ 100Ω
    • 左ブレッドボード d-14からf-14100Ω
    • 左ブレッドボード d-15からf-15
    • 左ブレッドボード d-16からf-16100Ω
    • 左ブレッドボード d-17からf-17
    • 左ブレッドボード d-18からf-18
    • 右ブレッドボード g-18からe-18
    • 右ブレッドボード g-17からe-17100Ω
    • 右ブレッドボード g-16からe-16100Ω
    • 右ブレッドボード g-15からe-15
    • 右ブレッドボード g-14からe-14100Ω
    • 右ブレッドボード g-13からe-13
    • 右ブレッドボード g-12からe-12100Ω
    • 右ブレッドボード g-11からe-11100Ω R1135255_1024
  5. ブレッドボードとmbed LPC1768をジャンパワイヤで繋ぎます。
    • 左ブレッドボード a-11からmbed LPC1768のP11
    • 左ブレッドボード a-12からmbed LPC1768のP12
    • 左ブレッドボード a-13からmbed LPC1768のP13
    • 左ブレッドボード a-14からmbed LPC1768のP14
    • 左ブレッドボード a-15からmbed LPC1768のP15
    • 左ブレッドボード a-16からmbed LPC1768のP16
    • 左ブレッドボード a-17からmbed LPC1768のP17
    • 左ブレッドボード a-18からmbed LPC1768のP18
    • 右ブレッドボード a-18からmbed LPC1768のP21
    • 右ブレッドボード a-17からmbed LPC1768のP22
    • 右ブレッドボード a-16からmbed LPC1768のP23
    • 右ブレッドボード a-15からmbed LPC1768のP24
    • 右ブレッドボード a-14からmbed LPC1768のP25
    • 右ブレッドボード a-13からmbed LPC1768のP26
    • 右ブレッドボード a-12からmbed LPC1768のP27
    • 右ブレッドボード a-11からmbed LPC1768のP28R1135270_1024
  6. 左のブレッドボードが手前に向く様に90度向きを変えます。

ライブラリとサンプルプログラムのインストール

今回はsuu penさんのEightDotMatrixLedライブラリを使わせて頂きました。(suu penさんには、ライブラリご紹介の許可を頂いておりますが、ご不明な点に付いては、弊社宛にお問い合わせ下さい)

mbed開発者サイトへのユーザー登録は済ませておいて下さい。

  1. ブラウザでsuu penさんのeightDotMatrixLedLibraryExampleのページを開きます。
  2. 画面右の「Import this Program」のボタンをクリックします。
  3. Import Programのダイアログが開かれるので、Importボタンをクリックします。
  4. これでご自身のCompiler画面に新しいプログラムが出来てライブラリが取り込まれた状態になります。
  5. 配線をオリジナルのものから変えていますので、37行目をコメントアウトし、次行に下記のコードを挿入して下さい。

    EightDotMatrixLed segmentled(0, p25, p13, p14, p22, p16, p23, p27, p28, p21, p26, p18, p24);

 

サンプルプログラムのコンパイルと実行

  1. Compiler画面のCompilボタンをクリックします。
  2. コンパイルが実行され、バイナリーファイル(〜.bin)がダウンロードされます。
  3. mbed LPC1768をUSBケーブルでPCへ繋ぐと、USB外付けドライブ(mbed)として認識されます。
  4. mbedドライブへ先ほどダウンロードされたファイルをコピーします。
  5. mbed LPC1768上のリセットボタンを押すと、プログラムが実行されます。

R1135268_1024

サンプルスケッチの簡単な解説

  • 配列のuint8_t D_dotGrayData[4][8]に輝度データが入っています。
    • 1,2行目 0xff:アナログ値指定無効
    • 3,4行目 0~100の値:アナログの輝度
  • 配列のuint8_t D_dotDigitalData[4][8]に制御データが入っています。
    • 1行目 0:スムーズ消灯,1:スムーズ点灯
    • 2行目 0xff:スムーズ消灯無効(即時消灯), 1:スムーズ点灯
    • 3行目 0:スムーズ消灯, 1:アナログ値までスムーズ点灯
    • 4行目 0xff:スムーズ点灯無効
    • 3,4行目は明るさ0~100の値で定義されています。
  • 上記の組み合わせと横へのスクロールによって、下記のアニメーションが実行されています。
    • 1行目 スムーズに点灯して、スムーズに消灯
    • 2行目 スムーズに点灯して、パッと消灯
    • 3行目 アナログ値までスムーズに点灯して、スムーズに消灯
    • 4行目 指定のアナログ値で即時点灯
  • segmentled.EightDotMatrixLed_main((uint8_t*)D_dotGrayData, (uint8_t*)D_dotDigitalData); この行によって1行分の表示が行われます。ダイナミック点灯なので、これを何度も呼び出す事により、マトリックスの表示をしています。
  • コンストラクタを下記の様に書き換え、配列を[8][8]に拡張すれば、マトリックス全体を使う事も出来ます。

    EightDotMatrixLed segmentled(0, p25, p13, p14, p22, p16, p23, p27, p28, p21, p26, p18, p24, p11, p17, p12, p15);

さぁ、みなさんもマトリックスLEDに色んな表示をさせてみましょう。

おまけ

Arduino編と同様のhartbeatのサンプルプログラムを作ってみました。

#include "mbed.h"
#include "EightDotMatrixLed.h"

   EightDotMatrixLed segmentled(0, p25, p13, p14, p22, p16, p23, p27, p28,          p21, p26, p18, p24,  p11, p17, p12, p15);
// EightDotMatrixLed segmentled(0, D5,  A1,  A0,  D8,  D12, D7,  D3,  D2,           D9,  D4,  D10, D6,   A3,  D11, A2,  D13);

uint8_t D_dotGrayData_one[8][8] =   {
    {   0,    0,    0,    0,    0,    0,    0,    0},
    {   0,  100,  100,    0,    0,  100,  100,    0},
    { 100,  100,  100,  100,  100,  100,  100,  100},
    { 100,  100,  100,  100,  100,  100,  100,  100},
    { 100,  100,  100,  100,  100,  100,  100,  100},
    {   0,  100,  100,  100,  100,  100,  100,    0},
    {   0,    0,  100,  100,  100,  100,    0,    0},
    {   0,    0,    0,  100,  100,    0,    0,    0} 
};

uint8_t D_dotGrayData_two[8][8] =   {
    {   0,    0,    0,    0,    0,    0,    0,    0},
    {   0,    0,    0,    0,    0,    0,    0,    0},
    {   0,    0,  100,    0,    0,  100,    0,    0},
    {   0,  100,  100,  100,  100,  100,  100,    0},
    {   0,  100,  100,  100,  100,  100,  100,    0},
    {   0,    0,  100,  100,  100,  100,    0,    0},
    {   0,    0,    0,  100,  100,    0,    0,    0},
    {   0,    0,    0,    0,    0,    0,    0,    0} 
};


uint8_t D_dotDigitalData[8][8] = {
    {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
    {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
    {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
    {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
    {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
    {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
    {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
    {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}
};


Timer timer;    // data change timer
uint8_t pattern = 0;

// Ticker flipper;

void flip() {
    if(pattern == 0){
        segmentled.EightDotMatrixLed_main((uint8_t*)D_dotGrayData_two, (uint8_t*)D_dotDigitalData);      
    } else {
        segmentled.EightDotMatrixLed_main((uint8_t*)D_dotGrayData_one, (uint8_t*)D_dotDigitalData);      
    }
}
    
int main() {
//    flipper.attach_us(&flip, 300); // the address of the function to be attached (flip) 
    timer.start();

    while(1) {
        // After 500[ms] to start the process
        if(timer.read_ms() >= 200){
            timer.reset();
        
            pattern++;
            if(pattern == 6) pattern = 0;
        }
        // This function, please repeat the process in less than 1ms.
        flip();
    }
}

マトリックスLEDキットの使い方(Arduino Uno編)

好評発売中のマトリックスLEDキットの使い方です。このページではArduino Unoでの使い方を説明します。

準備

 マトリックスLEDキットの内容

  • 8x8マトリックスLED × 1個
  • 100Ω抵抗(茶黒茶 金) × 10本 (この内8本を使います。2本は予備です)
  • 0Ω抵抗(黒帯1本のみ) × 10本 (この内8本を使います。2本は予備です)
  • ブレッドボード × 2個
  • ジャンパワイヤ(オス−オス)赤 × 4本
  • ジャンパワイヤ(オス−オス)緑 × 4本
  • ジャンパワイヤ(オス−オス)青 × 4本
  • ジャンパワイヤ(オス−オス)白 × 4本
  • ジャンパワイヤ(オス−オス)黒 × 4本 (これは予備になります。今回は使いません)

 キットの他に用意するもの

  • Arduino Uno
  • USBケーブル(A-B)
  • Windows/mac OS/Linux のいずれかを搭載したパソコン

 有ると便利なもの

組み立て方

  1. ブレッドボードを横に連結します。 R1135264_1024
  2. 8x8マトリックスLED をブレッドボードに挿します。LEDの1と書かれた(赤丸)側に 1番ピン(緑丸)が有るので、左側ブレッドボードのj-11に入る様に挿し込んで下さい。(青丸の並び) R1135263_1024
  3. 抵抗(100Ω × 8本、0Ω × 8本)の足を幅400mil(ブレッドボードの穴5つにまたがる長さ)に曲げます。 ワイヤーストリッピングゲージの5の所を使うと綺麗に曲げられます。 (合わせて抵抗の足を曲げた所から7〜8mm程度にニッパで短くカットしておくと綺麗に仕上がります) R1135265_1024
  4. 抵抗をブレッドボードに挿し込みます。(抵抗に向きはありません)
    • 左ブレッドボード d-11からf-11
    • 左ブレッドボード d-12からf-12
    • 左ブレッドボード d-13からf-13へ 100Ω
    • 左ブレッドボード d-14からf-14100Ω
    • 左ブレッドボード d-15からf-15
    • 左ブレッドボード d-16からf-16100Ω
    • 左ブレッドボード d-17からf-17
    • 左ブレッドボード d-18からf-18
    • 右ブレッドボード g-18からe-18
    • 右ブレッドボード g-17からe-17100Ω
    • 右ブレッドボード g-16からe-16100Ω
    • 右ブレッドボード g-15からe-15
    • 右ブレッドボード g-14からe-14100Ω
    • 右ブレッドボード g-13からe-13
    • 右ブレッドボード g-12からe-12100Ω
    • 右ブレッドボード g-11からe-11100Ω R1135255_1024
  5. ブレッドボードとArduino Unoをジャンパワイヤで繋ぎます。
    • 左ブレッドボード a-11からArduino UnoのA3
    • 左ブレッドボード a-12からArduino UnoのA2
    • 左ブレッドボード a-13からArduino UnoのA1
    • 左ブレッドボード a-14からArduino UnoのA0
    • 左ブレッドボード a-15からArduino UnoのD13
    • 左ブレッドボード a-16からArduino UnoのD12
    • 左ブレッドボード a-17からArduino UnoのD11
    • 左ブレッドボード a-18からArduino UnoのD10
    • 右ブレッドボード a-18からArduino UnoのD9
    • 右ブレッドボード a-17からArduino UnoのD8
    • 右ブレッドボード a-16からArduino UnoのD7
    • 右ブレッドボード a-15からArduino UnoのD6
    • 右ブレッドボード a-14からArduino UnoのD5
    • 右ブレッドボード a-13からArduino UnoのD4
    • 右ブレッドボード a-12からArduino UnoのD3
    • 右ブレッドボード a-11からArduino UnoのD2R1135252_1024
  6. 左のブレッドボードが手前に向く様に90度向きを変えます。

ライブラリのインストール

今回はarms22さんのDotsライブラリを使わせて頂きました。(arms22さんには、ライブラリご紹介の許可を頂いておりますが、ご不明な点に付いては、弊社宛にお問い合わせ下さい)

  1. Arduino IDEが起動していた場合、一旦終了させます。
  2. arms22さんのブログからmaster.zipをダウンロード(Dots-master.zipというファイル名でダウンロードされます)
  3. zipを展開し、フォルダ名をDots-masterからDotsへ修正します。
  4. Arduinoのスケッチ保存フォルダ(ドキュメント→Arduino や 書類→Arduinoなど)の下にlibrariesというフォルダを作ります。(既存の場合は次に進んで下さい。)
  5. librariesに先ほどのDotsフォルダを移動します。

この後、Arduino IDEを起動すると登録したライブラリを使用出来ます。

サンプルスケッチの実行

  1. Arduino IDE を起動します。
  2. メニューの「ファイル」→「スケッチの例」→「Dots」→「heartbeat」で、Dotsライブラリ付属のサンプルスケッチを開きます。
  3. メニューの「ツール」→「マイコンボード」 もしくは「ボード」*でArduino Unoを選択します。
  4. メニューの  「ツール」→「シリアルポート」 もしくは「ポート」*で正しいポートを選択します。
  5. 「マイコンボードに書き込む」のボタンでArduino Unoにサンプルスケッチをコンパイル・転送します。

これで、マトリックスLEDにハートマークが現れてドキドキと鼓動するアニメーションが表示されます。 R1135250_1024 * Arduino IDEのバージョンによって表示されるメニューが違います

サンプルスケッチの簡単な解説

  • 配列のconst byte one[]const byte two[]にアニメーションのパターンが定義されています。これを変更したり増やしたりすれば、カスタマイズが出来ますね。
  • myDots.write(0, two, 8);で定義されたパターンをLEDに表示させています。
  • この関数の第1引数はスキャン位置をずらす量なので、ずらす必要がなければ0です。
  • この関数の第2引数で表示させたいパターンの定義を指定します。
  • この関数の第3引数は定義パターンのバイト数なのでここでは8を指定しています。

さぁ、みなさんもマトリックスLEDに色んな表示をさせてみましょう。

むっちゃんの本日の一品「迫力満点!」

こんにちは。
外歩くと暑いくらいですが、アイルはひんやりです。
みなさまいかがお過ごしですか?

本日紹介するのは“D200 ティラノザウルス RC”です。

D200_R

見ての通り恐竜ロボットです!
歩くだけでなく、吠えることもできる迫力満点のロボットです。

作り方は木製パネルからパーツを抜き取り
差し込みながら組み立てるだけという簡単さ。
接着剤も不要です。

動かし方は2種類。
その1:リモコンで操作!
卵形のリモコンで前に進んだり、右へ歩いたり、左へ歩いたりさせることができます。
また、音センサと光センサで恐竜が吠える「デモモード」
音センサと光センサで一定の間、吠える、歩くの動作を行う「フリーモード」
コントロールのボタンを押すことで多彩なアクションをする「リモコンモード」
の3つのモードの切り替えが可能です。

その2:センサを使って操作!
音センサを利用する形で
1回手を叩くと、前進し吠えます。
2回手を叩くと、右方向にしばらく歩き、止まって吠えます。
3回手を叩くと、左方向にしばらく歩き、止まって吠えます。

組み立て簡単、遊び方も選べて、木製なのでインテリアとしても楽しめる
アイルでも人気の商品です♪

“D200 ティラノザウルス RC”はアイル店頭、WEBショップで販売中です。
↓ 画像クリックで商品購入ページヘジャンプします ↓

名称未設宁E1

ROSを使用したCRANE+の動かし方 その10

こんにちは!長谷川です。
この連載も、ついに10回目に突入しました。ここまで見てくださった皆様、本当にありがとうございます!
前回は、前々回作ったモデルと実物のCRANE+の連動のさせ方について説明しましたが、今回は、CRANE+の状態をモデルに反映させる方法について説明したいと思います。

依存関係の追加

今回書くプログラムを、前々回に作ったcrane_urdfパッケージ上で動かすためには、crane_urdfパッケージの依存パッケージが不足していると思います。そこで、依存関係を追加しましょう。端末を開いて、
[php]
$ roscd crane_urdf
$ vi CMakeLists.txt
[/php]
と入力します。前回はこの末尾に3文貼り付けましたが、今回は違う場所を編集します。
[php firstline=”7″]
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
sensor_msgs
std_msgs
)
[/php]
などと書かれているところがあると思います。roscpp,rospy,sensor_msgs,std_msgsの順番は、パッケージを作った際に記述した順番などにもよると思うので、あまり気にしないでください。この依存パッケージ群の中に、dynamixel_msgsを追加します。具体的には、以下のように修正します。
[php firstline=”7″]
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
sensor_msgs
dynamixel_msgs
std_msgs
)
[/php]
ここを書き直し終わったら、保存してviを終了してください。
次に、[php]vi package.xml[/php]と入力して、package.xmlを開きましょう。
[xml firstline=”42″]
<buildtool_depend>catkin</buildtool_depend>
<build_depend>roscpp</build_depend>
<build_depend>rospy</build_depend>
<build_depend>sensor_msgs</build_depend>
<build_depend>std_msgs</build_depend>
<run_depend>roscpp</run_depend>
<run_depend>rospy</run_depend>
<run_depend>sensor_msgs</run_depend>
<run_depend>std_msgs</run_depend>
[/xml]
などと書かれているところがあると思います。他の依存パッケージの例にならって、dynamixel_msgsも追加します。具体的には、以下のように修正します。
[xml firstline=”42″]
<buildtool_depend>catkin</buildtool_depend>
<build_depend>roscpp</build_depend>
<build_depend>rospy</build_depend>
<build_depend>sensor_msgs</build_depend>
<build_depend>dynamixel_msgs</build_depend>
<build_depend>std_msgs</build_depend>
<run_depend>roscpp</run_depend>
<run_depend>rospy</run_depend>
<run_depend>sensor_msgs</run_depend>
<run_depend>dynamixel_msgs</run_depend>
<run_depend>std_msgs</run_depend>
[/xml]
修正し終わったら、保存してviを終了してください。これで、依存関係の追加は完了しました。

新しいdisplay.launchの作成

前回、
[php]roslaunch urdf_tutorial display.launch model:=crane.urdf gui:=True[/php]
なる命令を実行していました。この際、urdf_tutorialというパッケージ内のdisplay.launchを立ち上げていましたが、このdisplay.launchのままだと、今回実行したいプログラムが実行できません。そこで、新たなdisplay.launchをcrane_urdf内に作ることにしました。端末に、
[php]
$ roscd crane_urdf/src
$ vi display.launch
[/php]
と入力します。以下を貼り付けます。
[xml]
<launch>
<arg name="model" />
<arg name="gui" default="False" />
<param name="robot_description" textfile="$(arg model)" />
<param name="use_gui" value="$(arg gui)"/>
<rosparam param="source_list">["joint_states_source"]</rosparam>
<node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" />
<node name="robot_state_publisher" pkg="robot_state_publisher" type="state_publisher" />
<node name="rviz" pkg="rviz" type="rviz" args="-d $(find urdf_tutorial)/urdf.rviz" required="true" />
</launch>
[/xml]
貼り付けたら、保存してviを終了してください。これで、新しいdisplay.launchが完成しました。完成しましたが、何やってるのかさっぱりな方も多いと思います。基本的には、urdf_tutorialパッケージのdisplay.launchの真似ですが、
[xml firstline=”6″] <rosparam param="source_list">["joint_states_source"]</rosparam>[/xml]
の一文を書き加えています。この後出てくるプログラムでは、joint_state_publisherノード(Joint State Publisherウィンドウを管理しているノード)に各関節の関節角データを送り、それをjoint_state_publisherノードがrvizに送ることにより、モデルを動かしているのですが、ここをよく読むとわかる通り、それをするためには、joint_state_publisherが購読するトピックを指定してあげなければなりません。指定方法は、source_listというパラメータに、トピックの名前を書き込んであげればいいようです。付け加えた文では、このsource_listに/joint_states_sourceというトピック名を書き込んでいます。これにより、display.launchが実行されると、/joint_states_sourceを購読しながら、その値に応じたメッセージを/joint_statesに配信してくれるjoint_state_publisherが起動することになります。なお、この際、/joint_states_sourceトピックが存在していない場合は、自動で生成されるようです。

プログラムの作成

次に、プログラムを作成しましょう。
crane_urdf/srcにいる状態で、[php]vi reflect_crane_in_rviz.cpp[/php]と入力します。以下を貼り付けます。
[cpp]
#include "ros/ros.h"

#include "std_msgs/Float64.h"
#include "sensor_msgs/JointState.h"
#include "dynamixel_msgs/MotorStateList.h"

#include <sstream>

#define PI 3.14159265
#define MIDDLE_VAL 512
#define CHANGE_TO_DEG (300.0/1024.0)
#define CHANGE_TO_RAD (PI/180.0)

sensor_msgs::JointState jointstate;
char renew = 0;

void reflect_jointstate(const dynamixel_msgs::MotorStateList::ConstPtr& motorstates);

int main(int argc, char **argv)
{
ros::init(argc, argv, "reflect_crane_in_rviz");

ros::NodeHandle n;

ros::Publisher joint_states_pub = n.advertise<sensor_msgs::JointState>("/joint_states_source", 10);

ros::Subscriber sub = n.subscribe("/motor_states/pan_tilt_port", 10, reflect_jointstate);

ros::Rate loop_rate(100);

jointstate.name.push_back("joint1");
jointstate.name.push_back("joint2");
jointstate.name.push_back("joint3");
jointstate.name.push_back("joint4");
jointstate.name.push_back("joint5");
jointstate.position.push_back(0.0);
jointstate.position.push_back(0.0);
jointstate.position.push_back(0.0);
jointstate.position.push_back(0.0);
jointstate.position.push_back(0.0);

while (ros::ok())
{
while(ros::ok() && renew==0){
ros::spinOnce();
loop_rate.sleep();
}
jointstate.header.stamp = ros::Time::now();
joint_states_pub.publish(jointstate);
renew = 0;

ros::spinOnce();
loop_rate.sleep();
}
return 0;
}

void reflect_jointstate(const dynamixel_msgs::MotorStateList::ConstPtr& motorstates)
{
int id;
for(id=1;id<=5;id++){
jointstate.position[id-1] = ((double)(motorstates->motor_states[id-1].position)-MIDDLE_VAL)*CHANGE_TO_DEG*CHANGE_TO_RAD;
}
renew = 1;
}
[/cpp]
貼り付けたら、保存してviを終了してください。これがソースコードになります。今まで、ファイルを実行可能にする処理をしてきましたが、あれは別にいらなかったようなので、今回は飛ばします。
次に、
[php]
$ roscd crane_urdf
$ vi CMakeLists.txt
[/php]
と入力します。末尾に以下の3文を貼り付けます。
[php]
add_executable(reflect_crane_in_rviz src/reflect_crane_in_rviz.cpp)
target_link_libraries(reflect_crane_in_rviz ${catkin_LIBRARIES})
add_dependencies(reflect_crane_in_rviz crane_urdf_generate_messages_cpp)
[/php]
これで保存してviを終了してください。
次に、crane_urdfパッケージをビルドしましょう。
[php]
$ cd ~/catkin_ws/
$ catkin_make
[/php]
と入力します。「「100%」 Built target reflect_crane_in_rviz」と出てきていたら、ビルドが成功していると思います。

CRANE+とモデルの連動

以上で準備は整いました。第5回目の記事にしたがって、CRANE+とPCを接続し、今回は「roslaunch my_dynamixel_tutorial controller_manager.launch」
まで入力してください。「roslaunch my_dynamixel_tutorial start_tilt_controller.launch」まで入力してしまうと、CRANE+の関節角が固定されてしまい、手で動かせなくなるのでご注意ください。もしそうなった場合は、一回Ctrl-cを押してROSを終了してから、CRANE+の電源を切り、その後再度電源をいれ、操作をやり直してください。
その後、新しい端末を開いて、
[php]
$ roscd crane_urdf/src
$ roslaunch crane_urdf display.launch model:=crane.urdf
[/php]
と入力して、rvizを表示します。新しい端末を開き、
[php]rosrun crane_urdf reflect_crane_in_rviz[/php]
と入力すれば、rviz内のモデルが実物のCRANE+の状態を反映するようになります。けがやCRANE+の破壊に注意しながら、CRANE+の各関節を手で動かしてみてください。モデルとCRANE+が同じように動くと思います。なお、モデルに定義された回転角の限界以上まで関節を回すと、変な動きをしてしまいますが、ご容赦ください。

以上、CRANE+の状態をモデルに反映させる方法について説明しました。
次回は、CRANE+の状態をrviz上でモニタリングしつつ、CRANE+を自動で動かすプログラムを作ってみたいと思います。

Turtlebotで部屋の好きな場所に移動する(1)

出村です!今日もよろしくお願いします!
今出村はTeam IcARusというエンジニアチームで本物のドローンを使った現実融合(Augumented Reality)型空中対戦ゲーム「Drone Space Defence」を開発中です!
今週の金曜,4/24に東京のお台場で開かれる世界的なイベント「SLUSH ASIA」でゲーム「Drone Space Defence」を展示します!国際的なドローンパフォーマ・芸人とのコラボもします!
最先端の技術が体験できます!よろしければ体験しに来てください!
dsd
SLUSH ASIA
Team IcARus HP

Turtlebotで部屋の好きな場所に移動する

部屋の好きな場所に移動できるロボットを作ってみたいと思ったことはありませんか?
KinectというデバイスとSLAMという技術を使えば可能です!
Kinectはジェスチャー認識デバイスとして有名ですが、Kinectの中にはRGBカメラ(普通のカメラ)とデプスカメラ(深さを測るカメラ)が入っています。
kinect_pic
この画像はkinect V1で撮ったものです!左が深さ画像、右がRGB画像になります。
SLAM(Simultaneous Localization and Mapping)はロボット等の地図生成と自己位置推定を同時に行うことのできる技術です!SLAMをするために必要なものは地図を生成するための情報と自己位置推定をするための情報で、この情報をKinectとTurtlebotだけで補うことができます!

今回の開発環境はUbuntu 14.04,ROS Indigo, Kinect V1, Turtlebotです。

Turtlebotの動作確認

まず、今回はTurtlebotを動かすためにROS(Robot Operating System)というロボットミドルウエアを使用します!
ROS環境をまだ構築していない方はROSを使用したCRANE+の動かし方の1〜4章を見て下さい!
Turtlebotを動かすためのROSパッケージは入っているでしょうか?入っていない場合はFamily&Robotics勉強会にTurtlebotパッケージの入れ方があるので下記のfamily&Robotics勉強会のURLを参考にしてください!
family&Robotics勉強会資料 Turtlebotパッケージの入れ方
turlebotを起動します!turtlebotの接続ケーブルをPCのUSBにつないで下さい!
[php]
$ roslaunch turtlebot_bringup minimal.launch
[/php]
このとき音がなればturtlebotとPCとの接続が確立しています!

Ubuntu 14.04にkinect V1 driverを入れる

Ubuntu 14.04ではkinect V1のドライバーがaptで入るパッケージ(PPA含む)だけでは上手く動作しません。
以下のサイトの説明にしたがってkinect V1のドライバーを入れて下さい!このインストール方法で入るのは新型のKinectドライバーではないのですが、これしかドライバーをUbuntu 14.04に入れる方法が見つかりませんでした!(ソースインストール+aptパッケージ)
Kinect V1をUbuntu 14.04で使えるようにする
また、kinect V1の接続ケーブルのランプは緑色に光っているでしょうか?光っていない場合はkinect V1への電源が供給されていないもしくは断線しています。
IMG_20150417_170706
ドライバがPCに認識されているかどうかは以下のコマンドで確認できます。
[php]
$ lsusb | grep "Xbox"
[/php]
kinect_driver
この3つのデバイスが認識されていたら成功です!Xbox NUI Motorだけが認識されている場合は正しく認識していません。
次にROSのTurtlebot PackageがKinectを使用できるようにします。以下のコマンドでROSから使用できるようになります。
[php]
$ echo "export TURTLEBOT_3D_SENSOR=kinect" >> ~/turtlebot/devel/setup.sh
$ source ~/turtlebot/devel/setup.bash
[/php]
Kinectセットアップ完了です!

Turtlebotを操縦する

Turtlebotを操縦してみましょう!Turtlebotの移動にはキーボードかPS3コントローラを使います!

キーボードで操縦する場合

[php]
$ roslaunch turtlebot_teleop keyboard.launch
[/php]
このコマンドを入力したターミナルが選択されているとき(最後にクリックしたものがコマンドを入力したターミナル)だけキーボード入力を受け付けます!

PS3コントローラを使いたい場合

PS3コントローラを使用するときはBluetooth内蔵PCが推奨されます。Bluetoothがある場合は無線でPS3コントローラが動かせます。
PS3コントローラのドライバーパッケージを入れます。
[php]
$ sudo apt-add-repository ppa:falk-t-j/qtsixa
$ sudo apt-get update
$ sudo apt-get install sixad
[/php]
PS3コントローラをUSB経由でPCと接続します。そしてこのコマンドを入力してください。
[php]
$ sudo sixpair
[/php]
PS3コントローラをUSBケーブルから外し、
[php]
$ sixad –start
[/php]
でPS3コントローラのPSボタンを押し続けると認識されます。
DUALSHOCKコントローラでは認識時に振動します。SIXADコントローラでは認識時にPS3のユーザーを示すLEDがぐるぐる回るだけです。
[php]
$ roslaunch turtlebot_teleop ps3_teleop.launch
[/php]
L1がデッドロックになっています。L1を押しながらでないと入力を受け付けません。
L1 + 左ジョイスティックを上にかたむけると前進、L1 + 左ジョイスティックを左に傾けると左に回り、L1 + 左ジョイスティックを右に傾けると右に回ります。

TurtlebotでSLAM

SLAMには2Dマップと3Dマップの2種類があります。今回は2DマップのSLAMを使用します。

Turtlebotで地図生成

今回は地図生成にGmappingというアルゴリズムを使用します。以下のコマンドを入力して下さい!
[php]
$ roslaunch turtlebot_bringup minimal.launch
$ roslaunch turtlebot_bringup 3dsensor.launch
$ roslaunch turtlebot_navigation gmapping_demo.launch
[/php]
これでSLAMプログラムが起動しました!
[php]
$ roslaunch turtlebot_rviz_launchers view_navigation.launch
[/php]
これで地図生成の可視化をします!
PS3コントローラやキーボードでTurtlebotを移動させてみましょう!
すると、地図がどんどん生成されていくではないでしょうか!
ロボットを移動するほど地図が生成されます。

地図を保存したい場合

地図を保存したい場合は下のコマンドを入力して下さい!
[php]
$ rosrun map_server map_saver -f ~/Pictures/rosmap
[/php]
このコマンドではファイルはPicturesにrosmap.pgmというファイル名で保存されますが任意の場所に任意のファイル名で保存したいときは
[php]
$ rosrun map_server map_saver -f /パス名/ファイル名
[/php]
と入力して下さい!
生成された地図を見てみます!gimpという画像エディタがlinuxでは使いやすいのでインストールを推奨します。以下のコマンドを入力するとインストールできます!
[php]
$ sudo apt-get install gimp
[/php]
そして以下のコマンドで生成された地図を見ることができます!
[php]
$ gimp ~/Pictures/rosmap.pgm
[/php]
どうでしょうか。下の画像のような地図が生成されたでしょうか。
RTMap

Turtlebotを部屋の好きな場所に移動させる

では生成した地図データを元にTurtlebotを部屋の好きな場所へ移動させましょう!今回はロボットの位置推定にAMCL(Adaptive Monte Calro Localization)という2Dマップのアルゴリズムを使用します。
まず生成した地図データを指定します。以下のコマンドで指定できます。
[php]
$ export map_server map_saver -f ~/Pictures/rosmap.yaml
[/php]
任意のファイル名で地図を保存した場合は
[php]
$ export TURTLEBOT_MAP_FILE=/パス名/ファイル名
[/php]
そして以下のコマンドを入力してください!
[php]
$ roslaunch turtlebot_navigation amcl_demo.launch
$ roslaunch turtlebot_rviz_launchers view_navigation.launch
[/php]

するとこのような画面が開きます!
部屋の好きな場所に移動するためには2つの操作をする必要があります!

estimation

1.現在地の指定
rvizアプリケーションの上のタブの”2D Pose Estimate”をクリックして、現在地をrvizのマップ上でクリックして指定してください!
2.目的地の指定
rvizアプリケーションの上のタブの”2D Nav Goal”をクリックして、目的地をrvizのマップ上でクリックして指定してください!

するとロボットが目的地に向かって移動します!
これでマップに載っている場所なら部屋の好きな場所のどこにでも行くことが可能です!
turtlebot_3dmapping

今回はGUIで現在地と目的地を指定しました。ですが、テキストファイルに現在地と目的地を記載して場所を指定したり、ウエイポイント走行をすることも可能です!
また、SLAM技術には色々なアルゴリズムがあります。今回は2Dマップでしたが、3Dマップを生成して3Dマップの情報を元に位置推定を行うことも可能です!
次はRGB-DのSLAM,ウエイポイント走行や、画像追跡について書きます!

むっちゃんの本日の一品「初めてでも応用でも」

こんにちは。
午後になって風が冷たくなってきましたね。

本日紹介するのは“DARWIN-MINI”です。

SONY DSC

どアップ!

SONY DSC

“DARWIN-MINI”は「ロボット作ってみたい!」という初心者の方におすすめ。
オススメするポイントは3つ。
・作るのが簡単!
・お持ちのスマートフォン(Androidのみ)から操作可能!
・難しいプログラミング不要!

無料のアプリにサンプルの動きが多く入っていますし
ロボットのポーズを記録し、それを繋げて一連の動きを作ることもできます。
それを長くつなげることでダンスなどもさせることができます。

おすすめするのは初心者の方だけではありません。
Arduino互換機を搭載しているので
C言語で動くロボットを作ってみたい方にもおすすめです!

またタッチセンサ、磁気センサ、測距センサ、赤外線センサなど
オプションのセンサも充実しているので
センサなどを使って動かしてみたいという上級者さんにもおすすめです。

オープンソースなので外装を3Dプリンタで作成することも可能です。
付属のシールを貼って見た目を変えることもできます。

とにかくロボットを作ってみたい方!
C言語勉強したからそれで動かせるロボット作ってみたい方!
センサなど使って自分好みのヒューマノイドロボットを作ってみたい方!
“DARWIN-MINI”でロボットライフを充実させてみませんか?

“DARWIN-MINI”はアイル店頭、WEBショップで販売中です。
↓ 画像クリックで商品購入ページヘジャンプします ↓

901-0046-200

むっちゃんの本日の一品「実は奥が深いんです」

こんにちは。
さっきまでの晴れが嘘のようにすごい雨が降り出してしまいましたが
みなさんは傘お持ちでしたか?
半信半疑で折りたたみ傘持ってきてよかったな~と思いましたw

本日紹介するのは“アルミ板材”です。
アイル店頭でも奥の方にひっそりと陳列されているアルミ板材。

SONY DSC

取り扱っているのをご存知ない方も多いのでは?

CAD図面などをプリントアウトして貼り付けるのに便利なA4サイズです。
材質は一般的に薄くても固いジュラルミンA2017と
ロボットなどの曲げ部品によく用いられるA5052の2種類を取り扱っています。

A2017は強度が必要で歪んでほしくないところに用いることが多いです。
なのでこちらの型番は曲げ加工はできません。

アイル店頭ではA5052は厚み2.0mm,1.5mm,1.2mm,1.0mmの4種類↓

SONY DSC

A2017は2.0mm,1.5mm,1.0mmの3種類取り揃えています。↓

SONY DSC

WEBショップではこの他にA5052は3.0mm,4.0mm,5.0mm、A2017は3.0mmも取り揃えています。

またアルマイト加工も承っております。

SONY DSC

アルマイトとはアルミの表面を溶かして着色処理する方法です。
着色するだけでなく、錆びにくくするなどのメリットがあります。
ただし若干表面が痩せてしまいます。

ちょっと豆知識☆
ジュラルミンにはJIS規格で以下の3種類があります。
・A2017-ジュラルミン
・A2024-超ジュラルミン
・A7075-超々ジュラルミン
この超々ジュラルミンは飛行機なんかに使われているそうですよ!

アルミ板にレーザーで穴をあける場合、
板の厚みより小さい径の穴は溶けてしまうのであけられないそうです。

なかなか奥が深いですね!

“アルミ板材、アルマイト加工”はアイル店頭、WEBショップで販売中です。
↓ 画像クリックで商品購入ページヘジャンプします ↓

RT-ALMA4T10

むっちゃんの本日の一品「かわいさはそのままに」

こんにちは。
昨日は雨に当たらず済みましたむっちゃんです。

本日紹介するのは“プラロビ Robi”です。

SONY DSC

その洗練されたデザインで世界的に有名なロボットクリエイター・高橋智隆氏が設計
デザインをしたロボットRobi(ロビ)はご存知の方も多いはず。

そんなロビの半分の大きさのプラモデルがこのプラロビです。
接着剤や塗装不要で、組み立ては非常に簡単です。
実物と同じ箇所が可動する、プラスチックモデルです。

作って飾って癒されてみませんか?

“プラロビ Robi”はアイル店頭、WEBショップで販売中です。
↓ 画像クリックで商品購入ページヘジャンプします ↓

プラRobi_Pac_OL02

ROSを使用したCRANE+の動かし方 その9

こんにちは!長谷川です。
前回はCRANE+のURDFモデルの作り方について説明しましたが、今回は、前回作ったモデルと実物のCRANE+の連動のさせ方について説明したいと思います。

プログラムの作成

まずは、モデルとCRANE+を連動させるプログラムを作成しましょう。端末を起動し、
[php]
$ roscd crane_urdf/src
$ vi reflect_rviz_in_crane.cpp
[/php]
と入力してviを起動します。以下を貼りつけます。
[cpp]
#include "ros/ros.h"

#include "std_msgs/Float64.h"
#include "sensor_msgs/JointState.h"

#include <sstream>

std_msgs::Float64 pos1;
std_msgs::Float64 pos2;
std_msgs::Float64 pos3;
std_msgs::Float64 pos4;
std_msgs::Float64 pos5;
char renew = 0;

void reflect_jointstate(const sensor_msgs::JointState::ConstPtr& jointstate);

int main(int argc, char **argv)
{
ros::init(argc, argv, "reflect_rviz_in_crane");

ros::NodeHandle n;

//publish command message to joints/servos of arm
ros::Publisher joint1_pub = n.advertise<std_msgs::Float64>("/tilt1_controller/command", 1000);
ros::Publisher joint2_pub = n.advertise<std_msgs::Float64>("/tilt2_controller/command", 1000);
ros::Publisher joint3_pub = n.advertise<std_msgs::Float64>("/tilt3_controller/command", 1000);
ros::Publisher joint4_pub = n.advertise<std_msgs::Float64>("/tilt4_controller/command", 1000);
ros::Publisher joint5_pub = n.advertise<std_msgs::Float64>("/tilt5_controller/command", 1000);

ros::Subscriber sub = n.subscribe("/joint_states", 10, reflect_jointstate);

ros::Rate loop_rate(100);
while (ros::ok())
{
while(ros::ok() && renew==0){
ros::spinOnce();
loop_rate.sleep();
}
joint1_pub.publish(pos1);
joint2_pub.publish(pos2);
joint3_pub.publish(pos3);
joint4_pub.publish(pos4);
joint5_pub.publish(pos5);
renew = 0;

ros::spinOnce();
loop_rate.sleep();
}
return 0;
}

void reflect_jointstate(const sensor_msgs::JointState::ConstPtr& jointstate)
{
pos1.data = jointstate->position[0];
pos2.data = jointstate->position[1];
pos3.data = jointstate->position[2];
pos4.data = jointstate->position[3];
pos5.data = jointstate->position[4];

renew = 1;
}
[/cpp]
これが、C++言語で書かれたソースコードになります。貼りつけたら、保存してviを終了してください。その後、
[php]chmod +x reflect_rviz_in_crane.cpp[/php]
と入力して、ファイルを実行可能にしておきましょう。
次に、
[php]
$ roscd crane_urdf
$ vi CMakeLists.txt
[/php]
と入力します。末尾に以下の3文を貼りつけます。
[php]
add_executable(reflect_rviz_in_crane src/reflect_rviz_in_crane.cpp)
target_link_libraries(reflect_rviz_in_crane ${catkin_LIBRARIES})
add_dependencies(reflect_rviz_in_crane crane_urdf_generate_messages_cpp)
[/php]
これで保存してviを終了してください。
次に、crane_urdfパッケージをビルドしましょう。
[php]
$ cd ~/catkin_ws/
$ catkin_make
[/php]
と入力します。「Linking ~」と書かれた一文の後に、「「100%」 Built target reflect_rviz_in_crane」と出てきていたら、ビルドが成功していると思います。

CRANE+とモデルの連動

これで準備は整ったので、CRANE+を実際に動かしてみましょう。第5回目の記事にしたがって、CRANE+とPCを接続し、「roslaunch my_dynamixel_tutorial start_tilt_controller.launch 」まで入力してください。
その後、
[php]
$ roscd crane_urdf/src
$ roslaunch urdf_tutorial display.launch model:=crane.urdf gui:=True
[/php]
と入力して、rvizとJoint State Publisherウィンドウを表示します。新しい端末を開き、
[php]rosrun crane_urdf reflect_rviz_in_crane[/php]
と入力すれば、実物のCRANE+がモデルの状態を反映するようになります。けがやCRANE+の破壊に注意しながら、Joint State Publisherウィンドウのバーを動かしてみてください。モデルとCRANE+が同じように動くと思います。
※天板上で動くので、天板にPC等を置くのは危険です。
※関節の可動範囲は最低限しか制限していないので、アームの先端が天板に当たったり、リンク同士がぶつかる可能性があります。CRANE+を破壊したり、けがをすることがないよう、無理のない速度と範囲で動かしてください。
※関節に指を挟まないよう注意してください。

プログラムの解説

今回のプログラムには、第7回目の記事で解説していない部分があるので、そこを説明したいと思います。
[cpp firstline=”32″]ros::Subscriber sub = n.subscribe("/joint_states", 10, reflect_jointstate);[/cpp]
ここで、/joint_statesというトピックを購読することを宣言しています。このトピックに新しいメッセージが来ると、reflect_jointstate()が呼び出されます。10というのは蓄えることのできるデータの最大数で、第7回で説明したものと同じ意味です。
なお、この/joint_statesには、Joint State Publisherが関節角を配信しており、そのトピックをrvizが購読して、取得した関節角をモデルに反映させることで、GUIでモデルを動かせるようになっています。このプログラムは、その仕組みを利用し、関節角をrvizとは独立して取得してCRANE+に反映させることで、CRANE+をrviz内のモデルと同じように動かしています。
[cpp firstline=”54″]void reflect_jointstate(const sensor_msgs::JointState::ConstPtr& jointstate)[/cpp]
この関数が呼び出された際、自動的に引数に新しいメッセージの内容が引き渡されます。つまり、sensor_msgs::JointState型のポインタjointstateの指し示すインスタンスには、新しいメッセージの内容が格納されています。
[cpp firstline=”56″]pos1.data = jointstate->position[0];[/cpp]
jointstate->position[0]には、モデルのjoint1の関節角が格納されています。それをpos1.dataに格納し、メイン文でpos1を/tilt1_controller/commandに配信することで、CRANE+のjoint1の関節角に反映します。

以上、前回作ったモデルと実物のCRANE+の連動のさせ方について説明しました。
次回は、CRANE+の状態をモデルに反映させる方法について説明したいと思います。

むっちゃんの本日の一品「あなたも一台いかがですか?」

こんにちは。
二日間もざーざー降りの雨で梅雨のようですね。

本日紹介するのは“AFINIA H480 3Dプリンタ”です。
みなさんはアイル店頭にAFINIAの実機が置いてあるのご存知でしょうか?
実際に造形しているときもあるんですよ!
それがこちらです↓

SONY DSC

こちらは実際に造形しているところです↓

SONY DSC

パーソナル3Dプリンタとして全米NO.1となった“AFINIA H479 3Dプリンタ”ですが
その機能性と使いやすさはそのままに、更に進化したのが
こちらの“AFINIA(アフィニア)H480 3Dプリンタ”なのです。

AFINIAのすごいところは4つです
・簡単!
・精度がいい!
・静か!
・匂いが少ない!

これまで手動で行っていた「プレートの水平調整」や「ノズルの高さ調整」は
プリント品質を上げるために非常に重要なポイントでしたが、手作業のため少し慣れが必要でした。
H480はこの作業を自動化しました。
「オートキャリブレーション」と「オートレベリング」機能を追加することで、
まったくの初心者の方でも手軽に最高品質の3Dプリントを楽しんで頂けるようになりました。
また作業を始めるのに必要な工具一式が同梱されているため、道具の事前準備は必要ありません。
買ったその日から安全に作業を始めていただけます。

積層ピッチは0.15mmで一般的な個人向け3Dプリンタと比べ30%以上も精密です。
積層ピッチをコントロールするアクチュエーターは
パソコンから0.1mm単位でコントロールすることができ、正確な造形を支えています。

X軸とY軸が独立して動く為、振動や起動音が最小限に抑えられ
そばに置いても気にならない静けさを実現しています。

対応している素材はABS樹脂とPLA樹脂です。
カラーバリエーションも豊富に取り揃えています。
これを溶かして積層していくのですが
ほかのプリンタと比べ素材を溶かしているときの匂いが弱いです。

本体サイズは245(横)×260(奥行)×350(高さ)mmと
オフィスでも研究室でも自宅でも場所をとらないコンパクトなサイズです。
造形範囲は130×130×130mmとそこそこ大きいものを造形することができます。

STLファイルが対応しており、STLデータ読み取り後
モデルサイズの変更、移動や、回転、造形速度の変更など
プリント操作用の日本語対応ソフトウェア「AFINIA 3D」もセットになっています。

3Dモデル作成アプリケーションはセットにはなっていません。
そこでいくつかおすすめのものを紹介したいと思います。
<無料のもの>
Autodesk 123D

designspark mechanical

Autodesk FUSION360

<有料のもの>
Metasequoia

Shade3D

Rhinoceros

ちなみに社長のおすすめはOpen SCADという無料のものです。

そうそう、先ほど作っていたのどんなのになったか気になった方多いのでは?
完成したのはこちらでした↓

SONY DSC

以前紹介した“IoT無線タグ TWE-Lite-2525A”がぴったり治まる四角いケースでした!
ちなみに紹介したブログはこちらです。←クリック!

さあ、あなたも作ってみたいもの3Dプリンタで形にしてみませんか?

“AFINIA H480 3Dプリンタ”はアイル店頭、WEBショップで販売中です。
↓ 画像クリックで商品購入ページヘジャンプします ↓

H480