デュアルショック2制御基板 製作・プログラム解説マニュアル(R8C/38A版)

Similar documents
I2C液晶(ST7032i使用)プログラム解説マニュアル(R8C/38A版)

SPI接続超小型グラフィック液晶(ST7565R使用)プログラム解説マニュアル(R8C/38A版)

RY_R8C38ボード RY-WRITER基板 自動書き込み・実行解説マニュアル

Microsoft PowerPoint - RL78G14_動画マニュアル_タイマRD.ppt [互換モード]

RS232-TTLレベル変換基板製作マニュアル

赤外線受光モジュール C言語リモコンプログラム解説マニュアル

ミニマイコンカー製作キットVer.2 C言語走行プログラム解説マニュアル

液晶・microSD基板(Ver.2)kit12_38aプログラム解説マニュアル データ解析(microSD)編 (R8C/38A版)

R8C/38Aマイコン R8C/35Aマイコン 制御ライブラリ解説マニュアル

基板マイコンカー製作キットVer.2 プログラム解説マニュアル

microSD基板 製作マニュアル

arduino プログラミング課題集 ( Ver /06/01 ) arduino と各種ボードを組み合わせ 制御するためのプログラミングを学 ぼう! 1 入出力ポートの設定と利用方法 (1) 制御( コントロール ) する とは 外部装置( ペリフェラル ) が必要とする信号をマイ

内容 1. 仕様 動作確認条件 ハードウェア説明 使用端子一覧 ソフトウェア説明 動作概要 ファイル構成 オプション設定メモリ 定数一覧 変数一

前回の内容 マイクロコンピュータにおけるプログラミング PC上で作成 コンパイル マイコンに転送 実行 プログラムを用いて外部の装置を動作させる LED turnonled turnoffled LCD printf プログラムを用いて外部の装置の状態を読み取る プッシュスイッチ getpushsw

1. A/D 入力について分解能 12bit の A/D コンバータ入力です A/D 入力電圧とディジタル値との対応は理論上 入力電圧 0V : 0 入力電圧 +3V : 4095 です 実際はオフセットと傾きがあり ぴったりこの数値にはなりません 2. A/D 入力に使用する信号 STM32L_A

R8C/M12Aマイコン実習マニュアル ブレッドボード版

CoIDE 用 F4D_VCP の説明 V /07/05 USB の VCP( 仮想 COM ポート ) による非同期シリアル通信を行うプログラムです Free の開発ツール CoIDE で作成した STM32F4 Discovery 用のプロジェクトです プログラムの開始番地は 0x

スライド 1

RTC_STM32F4 の説明 2013/10/20 STM32F4 内蔵 RTC の日付 時刻の設定および読み込みを行うプログラムです UART2( 非同期シリアル通信ポート 2) を使用して RTC の設定および読み込みを行います 無料の開発ツール Atollic TrueSTUDIO for

1. 使用する信号 1.1. UART 信号 UART 通信に使用する信号と接続相手との接続は以下の通りです UART 信号表 番号 CPU 機能名 CPU 信号名 基板コネクタピン番号 方向 接続相手の信号名 1 USART1_TX PA9 CN > RxD 2 USART1_R

1. USB の VCP( 仮想 COM ポート ) について USB の VCP( 仮想 COM ポート ) は USB を非同期シリアル通信として使用するための USB のドライバです PC には VCP ドライバをインストールする必要があります USB の VCP( 仮想 COM ポート )

1. UART について UART は Universal Asynchronous Receiver Transmitter の頭文字をとったもので 非同期シリアル通信と呼ばれます シリアル通信とは 一本の信号線でデータをやりとりするために 1bit ずつデータを送出することをいいます データを受

HDLトレーナーサンプルプログラム説明書

スライド 1

スライド 1

Microsoft Word - 実験4_FPGA実験2_2015

CoIDE 用 STM32F4_UART2 の説明 V /03/30 STM32F4 Discovery の非同期シリアル通信ポート UART2 の送受信を行うプログラムです Free の開発ツール CoIDE で作成したプロジェクトサンプルです プログラムの開始番地は 0x08000

スライド 1

RL78開発環境移行ガイド R8C/M16C, H8S/H8SXからRL78への移行(統合開発環境編)(High-performance Embedded Workshop→CS+)

SDC_SDIO_STM32F4 の説明 2013/09/17 SDIO インターフェースで SD カードをアクセスするプログラムのプロジェクトサンプルです FAT でファイルアクセスするために FatFs( 汎用 FAT ファイルシステム モジュール ) を使用しています VCP(USB 仮想 C

Jan/25/2019 errata_c17m11_10 S1C17 マニュアル正誤表 項目 リセット保持時間 対象マニュアル発行 No. 項目ページ S1C17M10 テクニカルマニュアル システムリセットコントローラ (SRC) 特性 19-3 S1C17M20/M

スライド 1

SOPC Builder ペリフェラル 簡易ユーザ・ガイド - PIO (Parallel I/O)

スライド 1

正転時とは反対に回転する これが逆転である 図 2(d) の様に 4 つのスイッチ全てが OFF の場合 DC モータには電流が流れず 停止する ただし 元々 DC モータが回転していた場合は 惰性でしばらく回転を続ける 図 2(e) の様に SW2 と SW4 を ON SW1 と SW3 を O

AKI-PIC16F877A開発キット (Ver1

スライド 1

2. 仕様 電源 :USB バスパワー (USB 入力の 5V 電源を使用します ) 出力 : 3.5mm ステレオジャック アナログステレオ出力 最大 20mArms 対応ヘッドホンインピーダンス 1Ω~500Ω RCA ピンジャック アナログ 2ch 出力 (L R) ラインレベル ヘッドホンア

目次 1 I2Cとは 13 結線写真 2 センサの多くがI2Cに対応 14 WHO_AM_I 3 マイコンでのI2C通信例 15 I2C読込みプログラム 4 とは 16 I2C読込みスクリプト概要① 5 タイミングパラメータ 17 I2C読込みスクリプト概要② 6 書込み 18 センサ読込みプログラ

1. プログラム実行時の動作プログラムを実行すると以下のように動作します 1) NUCLEO-F401RE 上の LED LD2( 緑 ) が 200mSec 間隔で点滅します 2. プロジェクトの構成 2.1. プロジェクト F401N_BlinkLD2 の起動画面 TrueSTUDIO で作成し

論文番号 分 2-2 平成 24 年度全国情報技術教育研究会第 41 回全国大会 ( 新潟大会 ) Xbee を活用した無線通信の研究 期日平成 24 年 8 月 9 日 ( 木 )~10 日 ( 金 ) 場所長岡市シティホールプラザ アオーレ長岡 香川県立三豊工業高等学校 電子科 本行

型名 RF007 ラジオコミュニケーションテスタ Radio Communication Tester ソフトウェア開発キット マニュアル アールエフネットワーク株式会社 RFnetworks Corporation RF007SDK-M001 RF007SDK-M001 参考資料 1

GR-SAKURA-SAのサンプルソフト説明

MB-LCD1 アセンブラ・ライブラリによる制御

割り込み 今までのプログラムは 順番にそって命令を実行していくのみ それはそれで良いが 不便な場合もある 例えば 時間のかかる周辺機器を使う場合 その周辺機器が動作を終了するまで CPU は待たなければいけない 方法 1( ポーリング ) 一定時間毎に 周辺機器の動作が終了したか調べる 終了していれ

CMOS リニアイメージセンサ用駆動回路 C CMOS リニアイメージセンサ S 等用 C は当社製 CMOSリニアイメージセンサ S 等用に開発された駆動回路です USB 2.0インターフェースを用いて C と PCを接続

PowerPoint プレゼンテーション

内容 1. 仕様 動作確認条件 ハードウェア説明 使用端子一覧 ソフトウェア説明 動作概要 ファイル構成 オプション設定メモリ 定数一覧 変数一

S1C17 Family Application Note S1C17 シリーズ PORT 多重割り込みアプリケーションノート Rev.1.0

三菱電機マイコン機器ソフトウエア株式会社

SP-1221 LIN I/F 基板 ユーザーズマニュアル 作成日 :2017 年 10 月 17 日

KEIm-25ヘッダーボードハードウェアマニュアル

1. LCD LS027B4DH01 について LS027B4DH01 は 400dot x 240dot のグラフィック LCD です 秋月電子通商で購入できます 外形サイズ : 62.8 x x 1.53mm LCD のフレキシブルケーブルの根元の部分はちょっと力を加えただけで表示が

スライド 1

Microsoft Word - N-TM307取扱説明書.doc

Studuinoプログラミング環境

Arduinoで計る,測る,量る

プログラミング実習I

Microsoft PowerPoint LC_15.ppt

回路 7 レジスタ ( 同期イネーブル及び非同期リセット付 ) 入力データを保持するのに用いる記憶素子 使用用途として, マイクロプロセッサ内部で演算や実行状態の保持に用いられる Fig4-2 のレジスタは, クロック信号の立ち上がり時かつ 信号が 1 のときに外部からの 1 ビットデータ R をレ

PIC の書き込み解説 PICライターを使うときに間違った使い方を見受ける 書き込み失敗の原因は知識不足にある やってはいけないことをしている 単に失敗だけならまだしも部品を壊してしまう 正しい知識を身に着けよう 書き込みに必要なピンと意味 ICSPを意識した回路設計の必要性 ICSP:In Cir

KDC

81 /******************************************************************************/ 82 /* スレーブアドレスの設定 */ 83 /*****************************************

第11回高校生ものづくりコンテスト全国大会 電子回路組立部門 プログラム解説マニュアル

Microsoft Word - PCMtoSPDIFmanual.doc

CMOS リニアイメージセンサ用駆動回路 C10808 シリーズ 蓄積時間の可変機能付き 高精度駆動回路 C10808 シリーズは 電流出力タイプ CMOS リニアイメージセンサ S10111~S10114 シリーズ S10121~S10124 シリーズ (-01) 用に設計された駆動回路です セン

CCD リニアイメージセンサ用駆動回路 C CCD リニアイメージセンサ (S11155/S ) 用 C は 当社製 CCDリニアイメージセンサ S11155/S 用に開発された駆動回路です S11155/S11156-

データ収集用 NIM/CAMAC モジュールマニュアル 2006/5/23 目次 クレート コントローラ CC/ NIM ADC 1821 (Seiko EG&G)...3 ADC インターフェイス U デッドタイム

-2 外からみたプロセッサ GND VCC CLK A0 A1 A2 A3 A4 A A6 A7 A8 A9 A10 A11 A12 A13 A14 A1 A16 A17 A18 A19 D0 D1 D2 D3 D4 D D6 D7 D8 D9 D10 D11 D12 D13 D14 D1 MEMR

UIOUSBCOM.DLLコマンドリファレンス

モータ HILS の概要 1 はじめに モータ HILS の需要 自動車の電子化及び 電気自動車やハイブリッド車の実用化に伴い モータの使用数が増大しています 従来行われていた駆動用モータ単体のシミュレーション レシプロエンジンとモータの駆動力分配制御シミュレーションの利用に加え パワーウインドやサ

バーコードハンディターミナル BT-1000 シリーズセットアップガイド ( 第 1 版 ) CE ***

tri_s_tg12864_vcp の説明 2014/02/05 飛石伝ひ CPU 基板 の LCD TG12864 の表示プログラムです 漢字表示 (JIS208) を行うことができます USB の VCP ( 仮想 COM ポート ) を使用して非同期シリアル通信により 表示試験を行うことができ

Nios II - PIO を使用した I2C-Bus (2ワイヤ)マスタの実装

CommCheckerManual_Ver.1.0_.doc

Taro-82ADAカ.jtd

C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ

EB-RL7023+SB/D2

講習会 Arduino

オーナーズ マニュアル SolitonWave 1

TOPPERS 活用アイデア アプリケーション開発 コンテスト 部門 : 活用アイデア部門アプリケーション開発部門 作品のタイトル : Toppers_JSP と Scicos_lab / (Scilab でも可 ) による 組込みメカトロニクス制御シミュレーション 作成者 : 塩出武 ( シオデタ

Microsoft PowerPoint pptx

電気的特性 (Ta=25 C) 項目 記号 条件 Min. Typ. Max. 単位 読み出し周波数 * 3 fop khz ラインレート * Hz 変換ゲイン Gc ゲイン =2-5 - e-/adu トリガ出力電圧 Highレベル Vdd V -

Microsoft Word - TC4011BP_BF_BFT_J_P8_060601_.doc

Transcription:

デュアルショック 2 制御基板製作 プログラム解説マニュアル (R8C/38A 版 ) 本マニュアルで説明している内容 本基板の対象マイコンボード 本基板の制作 ( 結線 ) についての説明 本基板のプログラムについての説明 PlayStation 2 用のアナログコントローラ デュアルショック 2 の状態を R8C/38A マイコンで読み込み ロボットなどを制御する基板の製作 プログラムの解説をしています RY_R8C38 ボード 本マニュアルで解説 本マニュアルで解説 本マニュアルの内容は 独自の解析によるものでメーカの保証外となります 自己責任での取り組みとなりますので ご了承ください デュアルショック (SCPH-1200) は動作しません 必ずデュアルショック 2(SCPH-10010) を使用してください 第 1.02 版 2015.10.17 株式会社日立ドキュメントソリューションズ

注意事項 (rev.6.0h) 著作権 本マニュアルに関する著作権は株式会社日立ドキュメントソリューションズに帰属します 本マニュアルは著作権法および 国際著作権条約により保護されています 禁止事項 ユーザーは以下の内容を行うことはできません 第三者に対して 本マニュアルを販売 販売を目的とした宣伝 使用 営業 複製などを行うこと 第三者に対して 本マニュアルの使用権を譲渡または再承諾すること 本マニュアルの一部または全部を改変 除去すること 本マニュアルを無許可で翻訳すること 本マニュアルの内容を使用しての 人命や人体に危害を及ぼす恐れのある用途での使用 転載 複製 本マニュアルの転載 複製については 文書による株式会社日立ドキュメントソリューションズの事前の承諾が必要です 責任の制限 本マニュアルに記載した情報は 正確を期すため 慎重に制作したものですが万一本マニュアルの記述誤りに起因する損害が生じた場合でも 株式会社日立ドキュメントソリューションズはその責任を負いません その他 本マニュアルに記載の情報は本マニュアル発行時点のものであり 株式会社日立ドキュメントソリューションズは 予告なしに 本マニュアルに記載した情報または仕様を変更することがあります 製作に当たりましては 最新の内容を確認いただきますようお願いします すべての商標および登録商標は それぞれの所有者に帰属します 連絡先 株式会社日立ドキュメントソリューションズ 135-0016 東京都江東区東陽六丁目 3 番 2 号イースト 21 タワー E-mail:himdx.m-carrally.dd@hitachi.com

目次 1. 概要... 1 1.1 目的... 1 1.2 構成... 1 1.3 資料の参照先... 2 2. コントローラ制御基板... 3 2.1 コントローラとの接続... 3 2.2 回路図... 4 2.3 コントローラのコネクタ... 6 2.4 制御基板を連結させる... 8 3. プログラム scph_10010.c の解説... 9 3.1 概要... 9 3.2 関数... 9 3.3 端子を変えるときは... 11 3.4 コントローラが不安定なときは... 11 4. ワークスペース ps_controller_types4_38a... 12 4.1 プロジェクトの構成... 12 4.2 プログラムリスト ps_controller_types4_38a.c... 13 4.3 R8C/38A マイコンで使用する内蔵周辺機能... 20 5. 大電流モータを接続する... 21 5.1 FET の選定... 21 5.2 取り付け方法... 21 5.3 その他の改造ポイント... 22 6. 参考文献... 23 - I -

- II -

1. 概要 1.1 目的 本マニュアルは PlayStation 用のデュアルショック 2( 型式 :SCPH-10010 以下コントローラ) のボタン操作を RY_R8C38 ボード (R8C/38A マイコン ) で読み込み モータなどを制御することを目的とした内容です デュアルショック (SCPH-1200) は動作しません 必ずデュアルショック 2(SCPH-10010) を使用してください デュアルショック 2(SCPH-10010) 1.2 構成 本マニュアルは 下記構成で説明しています 本マニュアルでは コントローラ制御基板を自作します デュアルショック 2 の押ボタンを検出 モータドライブ基板 TyeeS Ver.4 のモータ 5 個を制御 デュアルショック 2(SCPH-10010 コントローラ制御基板 RY_R8C38ボードモータドライブ基板 TypeS Ver.4 本マニュアルでは この基板を自作 デュアルショック 2 を接続 液晶とプッシュスイッ (5 個 ) でパラメータを調整 2 台以上 連結することができる モータ 1 モータ 2 モータ 3 モータ 4 モータ 5-1 -

1.3 資料の参照先 それぞれの基板 機器についての製作方法 内容は マイコンカーラリー販売サイト (https://www2.himdx.net/mcr/) の下表のマニュアルを参照してください 内容 マニュアル プログラムの開発環境についてルネサス統合開発環境操作マニュアル (R8C/38A 版 ) モータドライブ基板 TypeS Ver.4 について 液晶 プッシュスイッチ データフラッシュについて 製作についてモータドライブ基板 TypeS Ver.4 製作マニュアル プログラムについてモータドライブ基板 TypeS Ver.4 アナログセンサ基板 TypeS Ver.2 プログラム解説マニュアル 製作について液晶 microsd 基板製作マニュアル プログラムについて液晶 microsd 基板 kit12_38a プログラム解説マニュアル液晶編 - 2 -

デュアルショック2 2. コントローラ制御基板 2.1 コントローラとの接続 コントローラの動作電圧は 3.6V です そのため 三端子レギュレータで 3.3V を生成します 3.6V を出力する三端子レギュレータはほとんどありませんので 一般的な 3.3V 出力を使用します 差は 0.3V なので ほとんど問題ありません R8C/38A マイコンの動作電圧は 5V コントローラの動作電圧は 3.3V です 直接信号のやり取りはできません そのため 次のような変換が必要です 1R8C/38A マイコン コントローラへの信号は 5V 3.3V の電圧変換 2コントローラ R8C/38A マイコンへの信号は 3.3V 5V の電圧変換 今回は 1 は抵抗による分圧 2 はトランジスタで電圧変換しています 5V 3.3V 10 ピンコネクタ 3.3V IN 三端子レギュレータ OUT 5V 26 ピンコネクタ SCPH-10010 へ電圧変換電圧変換電圧変換電圧変換 DS_ACK(3.3V でプルアップ ) DS_SEL DS_CLK DS_CD DS_DAT P3_3 P3_5 P3_7 P3_4 RY_R8C38 CN5(26 ピンコネクタ) へボード液晶 プッシュスイッチ 5 8 P5_7~ P5_0-3 -

2.2 回路図 液晶とプッシュスイッチ (5 個 ) の接続は 液晶 microsd 基板 (Ver.2 含む ) と同様です - 4 -

- 5 -

2.3 コントローラのコネクタ コントローラ側のオスコネクタのピン配置を下記に示します コネクタ下部の金属端子は 4 ピンとケーブルのシールドに接続されています コネクタカバーを開けたところを 下記に示します - 6 -

ピンの名称を下表に示します 番号線の色 名称方向詳細 1 茶 DAT マイコン コントローラデータ 2 橙 CD マイコン コントローラコマンド 3 紫 7.6V 電源 4 黒 GND GND 5 赤 3.6V 電源 6 黄 SEL マイコン コントローラ 7 青 CLK マイコン コントローラ 8 無し無し 振動モータ用の電源です 5V でも振動しますが弱くなります コントローラを動作させるための電源です 3.3V でも可能です コントローラを選択する信号です "0" で有効 "1" で無効です クロック信号です コントローラは CLK の立ち上がりでコマンドを読み取ります 標準のクロックの間隔は 250μs ですが 遅くとも動作します アクノリッジ コントローラがデータを読み込むと 2μs 以上 "0" 9 緑 ACK マイコン コントローラになります 今回は接続しません 色は 異なることがあります 現品のコネクタの番号と色を必ず確認してください コントローラのコネクタを切断し 日本圧着端子製造 ( 株 )(JST) の XH コネクタ 10 ピンに取り付け直した例を 下記に示します - 7 -

2.4 制御基板を連結させる モータドライブ基板 TypeS Ver.4 は 1 枚で 5 個のモータを制御することのできる基板ですが ロボット競技大会ではモータを 6 個以上制御したいことがほとんどです 今回の基板は 1 台目の送信コネクタ (CN5) と 2 台目の受信コネクタ (CN4) をつなぎ合わせて 1つのコントローラで 1 台目と 2 台目のモータドライブ基板 TypeS Ver.4 を制御することができます 2 台目と 3 台目も同様に接続して増やすことができます コントローラからの信号を受信しているだけなので 論理的には無限に連結させることができます 3 枚連結させるときの概要を下記に示します なお コントローラが繋がっている 1 台目の基板を親基板 2 台目以降を子基板と呼びます 1 台目 ( 親基板 ) 2 台目 ( 子基板 ) デュアルショック 2 CN4(RECV) CN5(SEND) CN5(SEND) JP1 はショートコントローラ制御基板 RY_R8C38 ボードモータドライブ基板 TypeS Ver.4 JP1 は開放コントローラ制御基板 RY_R8C38 ボードモータドライブ基板 TypeS Ver.4 モータ 1 モータ 2 モータ 3 モータ 4 モータ 5 モータ 1 モータ 2 モータ 3 モータ 4 モータ 5 デュアルショック 2 の信号を取得して モータドライブ基板 TypeS Ver.4 基板のモータを制御します 1 台目のデュアルショック 2 の信号を取得して 2 台目のモータドライブ基板 TypeS Ver.4 基板のモータを制御します 3 台目 ( 子基板 ) CN4(RECV) 1 台目のデュアルショック 2 の信号を取得して 3 台目のモータドライブ基板 TypeS Ver.4 基板のモータを制御します JP1 は開放コントローラ制御基板 RY_R8C38 ボードモータドライブ基板 TypeS Ver.4 モータ 1 モータ 2 モータ 3 モータ 4 モータ 5-8 -

3. プログラム scph_10010.c の解説 3.1 概要 scph_10010.c は R8C/38A マイコンで PlayStation 用のデュアルショック 2( 型式 :SCPH-10010) と通信を行い ボタンとジョイスティックの情報を読み取るプログラムです また コントローラに付いている振動モータを制御することができます 本プログラムは単体では使用できません 各自が作成したメインプログラムから本プログラムにある関数を呼び出し使用します ( 今回は ps_controller_types4_38a.c から 各関数を呼び出します) コントローラ処理は R8C/38A マイコンの チップセレクト付クロック同期形シリアル I/O (SSU) のクロック同期通信モード を使用します SSU は コントローラ処理以外で使用することはできません コントローラとの通信処理は 0.25ms ごとに行います 今回はタイマ RB を使って 0.25m ごとに割り込みを発生させ 割り込みプログラム内で実行します 0.25ms ごとに実行できれば タイマ RB を使わなくても構いません 3.2 関数 本プログラムは 次の関数を用意しています initds 関数 書式 void initds( int mode ); 内容 引数 戻り値 コントローラや変数などを初期化します 割り込みを許可したあとに実行します 0 : コントローラを接続している 1 台目の基板 (0 以外 ):2 台目以降 ( コントローラは接続していない ) なし 例 initds( 0 ); setvaibratedata 関数 書式 void setvaibratedata( int mini,int big ); 内容 振動モータの振動を制御します 引数小モータの振動 [0:OFF 1:ON], 大モータの振動 [0~255:0~100% で振動 ] 戻り値 例 なし setvaibratedata( 1, 128); 小は ON 大は 50% で振動 dsprocess 関数 書式 void dsprocess( void ); 内容 引数 戻り値 コントローラの制御を行います 割り込みなどで 0.25ms ごとに実行します なし なし 例 dsprocess(); // 0.25ms ごとに実行 - 9 -

getdskeydata 関数 書式 unsigned int getdskeydata( void ); 内容 引数 コントローラのキーデータを取得します ボタンは 16 個あります なし unsigned int キーデータ (16bit) キーデータの 1bit が一つのボタンに対応しています 戻り値 15 14 13 12 11 10 9 8 START 右ジョイスティックの押しボタン 左ジョイスティックの押しボタン SELECT 7 6 5 4 3 2 1 0 R1 L1 R2 L2 例 d = getdskeydata(); if( d & DS_KEY_LEFT ) { // 左キー押されたらここを実行 } scph_10010.h に下記内容を定義しています 例の太字部分を 下記の太字部分に書き換えて 必要なボタンに置き換えてください キー定義 #define DS_KEY_LEFT (0x01 << 15) #define DS_KEY_DOWN (0x01 << 14) #define DS_KEY_RIGHT (0x01 << 13) #define DS_KEY_UP (0x01 << 12) #define DS_KEY_START (0x01 << 11) #define DS_KEY_R_JOYSTICK (0x01 << 10) #define DS_KEY_L_JOYSTICK (0x01 << 9) #define DS_KEY_SELECT (0x01 << 8) #define DS_KEY_SHIKAKU (0x01 << 7) #define DS_KEY_BATSU (0x01 << 6) #define DS_KEY_ARU (0x01 << 5) #define DS_KEY_SANKAKU (0x01 << 4) #define DS_KEY_R1 (0x01 << 3) #define DS_KEY_L1 (0x01 << 2) #define DS_KEY_R2 (0x01 << 1) #define DS_KEY_L2 (0x01 << 0) - 10 -

getdsjoystickdata 関数 書式 int getdsjoystickdata( int index ); 内容 引数 戻り値 コントローラのジョイスティックの位置を取得します ジョイスティックは 左側の上下の値 左右の値 右側の上下の値 左右の値の 4 種類あります int ジョイスティックの位置どのジョイスティックの値を取得するか指定します DS_LEFT_X : 左側の左右 (X) の値を取得 DS_LEFT_Y : 左側の上下 (Y) の値を取得 DS_RIGHT_X : 右側の左右 (X) の値を取得 DS_RIGHT_Y : 右側の上下 (Y) の値を取得 値 int -100~100 戻り値には -100~100 の値が返ってきます X の場合 左が -100 中心が 0 右が 100 となります Y の場合 下が -100 中心が 0 上が 100 となります i = getdsjoystickdata( DS_LEFT_X ); // i には 左側ジョイスティックの X の値が入る (-100~100) 例 if( getdsjoystickdata( DS_RIGHT_Y ) <= -50 ) { // 右側シ ョイスティックの Y が -50 以下ならここを実行 } 3.3 端子を変えるときは 基板を自作するとき コントローラの SEL 端子と接続している P3_3 端子は 変更することができます 端子を変更するときは scph_10010.h の下記部分を変更します 80 : #define DS_SEL_PORT p3_3 /* SEL 端子のポートレジスタ */ 81 : #define DS_SEL_PORTDIR pd3_3 /* SEL 端子のポート方向レシ スタ */ 3.4 コントローラが不安定なときは コントローラを使用していて キーデータがうまく取れないことがある 振動しないことがあるなど コントローラが不安定なときは scph_10010.c の次の部分を変更してみてください 84 : #define DS_SEND_WAIT 32 /* 1=0.25ms 64 が標準 */ 84 行の DS_SEND_WAIT は コントローラとの通信間隔です 数字 1 あたり 0.25ms です よって 32 0.25 =8ms 間隔で通信をします 規格は 16ms ごとに通信すると決められていますが 今回は 8ms ごとにして コントローラで操作した内容ができるだけ早くマイコンで読み込めるようにしています ただし 規格より小さい値なので コントローラによってはうまくキー情報が読み込めないなど不安定な状態になるかもしれません このときは 数字を大きくしてください (+10 ずつくらい ) コントローラとの通信間隔は遅くなりますが安定します 64 以上にしても不安定な場合は コントローラ以外の原因が考えられます その他の部分を確認してください - 11 -

4. ワークスペース ps_controller_types4_38a 4.1 プロジェクトの構成 1 lcd_lib.c lcd_libhc 2 printf_lib.c 3 4 ps_controller_ types4_38a.c scph_10010_r8c.c scph_10010_r8c.h 5 startup.c 6 types3_beep.c types3_beep.h 7 sfr_r838a.h 液晶制御ライブラリです 液晶を使用する場合は このファイルを追加します ファイルの位置 C:\WorkSpace\common_r8c38a\lcd_lib.c 通信をするための設定 printf 関数の出力先 scanf 関数の入力元を通信にするための設定を行っています 今回は printf 文や scanf 文は使いませんが 液晶の文字表示でこのファイルを追加しないとエラーが出るため 追加しておきます ファイルの位置 C:\WorkSpace\common_r8c38a\printf_lib.c 実際に制御するプログラムが書かれています R8C/38A マイコンの内蔵周辺機能 (SFR) の初期化も行います ファイルの位置 C:\WorkSpace\ps_controller_types4_38a\ ps_controller_types4_38a\ps_controller_types4_38a.c デュアルショック 2(SCPH-10010) を制御するためのライブラリです デュアルショック 2 を使用する場合は このファイルを追加します ファイルの位置 C:\WorkSpace\ps_controller_types4_38a\ ps_controller_types4_38a\scph_10010_r8c.c 固定割り込みベクタアドレスの設定 スタートアッププログラム RA の初期化 ( 初期値のないグローバル変数 初期値のあるグローバル変数の設定 ) などを行います ファイルの位置 C:\WorkSpace\ps_controller_types4_38a\ ps_controller_types4_38a\startup.c モータドライブ基板 TypeS Ver.4 に搭載しているブザーを制御するプログラムです ファイルの位置 C:\WorkSpace\ps_controller_types4_38a\ ps_controller_types4_38a\types3_beep.c R8C/38A マイコンの内蔵周辺機能を制御するためのレジスタ (Special Function Register) を定義したファイルです ファイルの位置 C:\WorkSpace\common_r8c38a\sfr_r838a.h - 12 -

4.2 プログラムリスト ps_controller_types4_38a.c 1 : /****************************************************************************/ 2 : /* 対象マイコン R8C/38A */ 3 : /* ファイル内容 モータドライブ基板 TypeS Ver.4+デュアルショック2 */ 4 : /* を使った制御プログラム */ 5 : /* バージョン Ver.1.00 */ 6 : /* Date 2014.03.21 */ 7 : /* Copyright ルネサスマイコンカーラリー事務局 */ 8 : /****************************************************************************/ 9 : 10 : /* 11 : 本プログラムは 12 : モータドライブ基板 TypeS Ver.4 13 : デュアルショック2 制御基板 14 : を使用したロボットを動作させるプログラムです 15 : */ 16 : 17 : /*======================================*/ 18 : /* インクルード */ 19 : /*======================================*/ 20 : #include <stdio.h> 21 : #include "sfr_r838a.h" /* R8C/38A SFRの定義ファイル */ 22 : #include "types3_beep.h" /* ブザー追加 */ 23 : #include "lcd_lib.h" /* 液晶表示用追加 */ 24 : #include "printf_lib.h" /* printf 使用ライブラリ */ 25 : #include "scph_10010_r8c.h" /* SCPH-10010 処理 */ 26 : 27 : /*======================================*/ 28 : /* シンボル定義 */ 29 : /*======================================*/ 30 : /* 定数設定 */ 31 : #define TRC_OTOR_CYCLE 20000 /* 左前, 右前モータPWの周期 */ 32 : /* 50[ns] * 20000 = 1.00[ms] */ 33 : #define TRD_OTOR_CYCLE 20000 /* 左後, 右後, サーホ モータPWの周期 */ 34 : /* 50[ns] * 20000 = 1.00[ms] */ 35 : #define FREE 1 /* モータモードフリー */ 36 : #define BRAKE 0 /* モータモードブレーキ */ 37 : 38 : /*======================================*/ 39 : /* プロトタイプ宣言 */ 40 : /*======================================*/ 41 : void init( void ); 42 : unsigned char dipsw_get( void ); 43 : unsigned char dipsw_get2( void ); 44 : unsigned char pushsw_get( void ); 45 : unsigned char cn6_get( void ); 46 : void led_out( unsigned char led ); 47 : void motor2_r( int accele_l, int accele_r ); 48 : void motor2_f( int accele_l, int accele_r ); 49 : void motor_mode_r( int mode_l, int mode_r ); 50 : void motor_mode_f( int mode_l, int mode_r ); 51 : void servopwmout( int pwm ); 52 : 53 : /*======================================*/ 54 : /* グローバル変数の宣言 */ 55 : /*======================================*/ 56 : int pattern; /* マイコンカー動作パターン */ 57 : unsigned long cnt1; /* タイマ用 */ 58 : unsigned long cnt_lcd; /* 液晶表示タイミング用 */ 59 : 60 : /* エンコーダ関連 */ 61 : long lencodertotal; /* 積算値保存用 */ 62 : int iencoder; /* 10ms 毎の最新値 */ 63 : unsigned int uencoderbuff; /* 計算用割り込み内で使用 */ 64 : 65 : /* TRCレジスタのバッファ */ 66 : unsigned int trcgrb_buff; /* TRCGRBのバッファ */ 67 : unsigned int trcgrd_buff; /* TRCGRDのバッファ */ 68 : 69 : /* モータドライブ基板 TypeS Ver.4 上のLED ディップスイッチ制御 */ 70 : unsigned char types_led; /* LED 値設定 */ 71 : unsigned char types_dipsw; /* ディップスイッチ値保存 */ 72 : 73 : /* モータのPW */ 74 : int m1_pwm; /* モータ1(CN10) のPW */ 75 : int m2_pwm; /* モータ2(CN11) のPW */ 76 : int m3_pwm; /* モータ3(CN12) のPW */ 77 : int m4_pwm; /* モータ4(CN13) のPW */ 78 : int m5_pwm; /* モータ5(CN14) のPW */ 79 : モータを制御する PW 周 期を設定します 値は 50ns 設定値 になりま す 今回は 20000 を設定し ているので 1.00ms が PW 周期になります 通常は 1ms で問題ありません ま た回路の応答速度の限界 で 0.5ms 以下にすると モ ータが制御できなくなること があります ロボットでは モータを 1 個 1 個制御することが多いの で 今回は motor 関数を使 わなくても 良いようにしま した モータの PW を設定する ときは m1_pwm~m5_pwm 変数に PW 値をセットして ください 値は -100~100 で プラスが正転 マイナス が逆転 0 で停止になりま す - 13 -

80 : /************************************************************************/ 81 : /* メインプログラム */ 82 : /************************************************************************/ 83 : void main( void ) 84 : { 85 : int i, ds_mini, ds_big; 86 : unsigned int d; 87 : 88 : /* マイコン機能の初期化 */ 89 : init(); /* 初期化 */ 90 : asm(" fset I "); /* 全体の割り込み許可 */ 91 : initbeeps(); /* ブザー関連処理 */ 92 : initlcd(); /* 液晶初期化 */ 93 : initds( 0 ); /* 0: メイン 1:2 台目以降 */ 94 : 95 : /* ロボットの状態初期化 */ 96 : motor_mode_f( BRAKE, BRAKE ); 97 : motor_mode_r( BRAKE, BRAKE ); 98 : motor2_f( 0, 0 ); 99 : motor2_r( 0, 0 ); 100 : servopwmout( 0 ); 101 : setbeeppatterns( 0x8000 ); 102 : 103 : while( 1 ) { 104 : 105 : /* 液晶表示処理 */ 106 : if( cnt_lcd >= 100 ) { // 液晶表示は100msごと 107 : cnt_lcd = 0; 108 : 109 : /* LCDにコントローラのボタンとジョイスティック (JS) の値表示 */ 110 : lcdposition( 0, 0 ); 111 : /* 0123456789abcdef 1 行 16 文字 */ 112 : lcdprintf( "%04x %+4d %+4d ", 113 : getdskeydata(), /* ボタン押下データ表示 */ 114 : getdsjoystickdata(ds_left_x), /* JS 左の横方向の値 */ 115 : getdsjoystickdata(ds_left_y) ); /* JS 左の縦方向の値 */ 116 : lcdposition( 0, 1 ); 117 : /* 0123456789abcdef 1 行 16 文字 */ 118 : lcdprintf( " %+4d %+4d ", 119 : getdsjoystickdata(ds_right_x), /* JS 右の横方向の値 */ 120 : getdsjoystickdata(ds_right_y) ); /* JS 右の縦方向の値 */ 121 : } 122 : 123 : // デュアルショック操作処理 124 : 125 : d = getdskeydata(); /* キー情報の取得 */ 126 : 127 : // 上下キーのチェック 128 : if( d & DS_KEY_UP ) { 129 : m1_pwm = 50; 130 : } else if( d & DS_KEY_DOWN ) { 131 : m1_pwm = -50; 132 : } else { 133 : m1_pwm = 0; 134 : } 135 : 136 : // ジョイスティック左の前後 137 : m2_pwm = getdsjoystickdata(ds_left_y); // -100~100 138 : 139 : // ジョイスティック右の前後 140 : m3_pwm = getdsjoystickdata(ds_right_x); // -100~100 141 : 142 : 143 : /* 振動モータ小制御 */ 144 : if( getdskeydata() & DS_KEY_ARU ) { // キー 145 : ds_mini = 1; 146 : } else { 147 : ds_mini = 0; 148 : } 149 : /* 振動モータ大制御 */ 150 : if( getdskeydata() & DS_KEY_SHIKAKU ) { // キー 151 : ds_big = 255; 152 : } else { 153 : ds_big = 0; 154 : } 155 : setvaibratedata( ds_mini, ds_big ); 156 : 157 : 158 : } // whileの終了 159 : } 160 : 1 台目 ( 親基板 ) は 0 2 台 目以降 ( 子基板 ) は 1 を設 定します コントローラのキー入力状 態を液晶に表示します 液 晶表示処理は 時間がか かるので 100ms に 1 回 表 示します ロボット動作前は表示し て 動作中は表示しないよ うにすると良いでしょう 変数 d にコントローラのボタン情報を代入します d & ボタン で ボタンが 押されているかチェックしま す ボタンは scph_10010_r8c.h の 4~19 行目に定義されて いますので コピペして使 ってください モータの回転数 (-100 ~ 100) を設定します 番号は 1~5 で 変数とモータの関 係は下記の通りです m1_pwm モータ 1(CN10) の PW m2_pwm モータ 2(CN11) の PW m3_pwm モータ 3(CN12) の PW m4_pwm モータ 4(CN13) の PW m5_pwm モータ 5(CN14) の PW 最初の引数 ( 今回は ds_mini) が 小モ ータの振動を制御します 0 で OFF 1 で ON です 2 つめの引数 ( 今回は ds_big) が 大 モータの振動を制御します 0~255 を代入し 0~100% で振動します - 14 -

161 : /************************************************************************/ 162 : /* R8C/38A スペシャルファンクションレジスタ (SFR) の初期化 */ 163 : /************************************************************************/ 164 : void init( void ) 165 : { 166 : int i; 167 : 168 : /* クロックをXINクロック (20Hz) に変更 */ 169 : prc0 = 1; /* プロテクト解除 */ 170 : cm13 = 1; /* P4_6,P4_7をXIN-XOUT 端子にする */ 171 : cm05 = 0; /* XINクロック発振 */ 172 : for(i=0; i<50; i++ ); /* 安定するまで少し待つ ( 約 10ms) */ 173 : ocd2 = 0; /* システムクロックをXINにする */ 174 : prc0 = 0; /* プロテクトON */ 175 : 176 : /* ポートの入出力設定 */ 177 : 178 : /* PW( 予備 ) 左前 _PW 右前 _PW ブザー 179 : センサ左端 センサ左中 センサ右中 センサ右端 */ 180 : p0 = 0x00; 181 : prc2 = 1; /* PD0のプロテクト解除 */ 182 : pd0 = 0xf0; 183 : 184 : /* センサ中心 スタートハ ー RxD0 TxD0 185 : DIPSW3 DIPSW2 DIPSW1 DIPSW0 */ 186 : pur0 = 0x04; /* P1_3~P1_0のプルアップON */ 187 : p1 = 0x00; 188 : pd1 = 0x10; 189 : 190 : /* 右前 _ 方向 ステア_ 方向 ステア_PW 右後 _PW 191 : 右後 _ 方向 左後 _PW 左後 _ 方向 左前 _ 方向 */ 192 : p2 = 0x00; 193 : pd2 = 0xff; 194 : 195 : /* DS_CD none DS_CLK DS_DAT 196 : DS_SEL エンコーダB 相 none エンコーダA 相 */ 197 : p3 = 0x00; 198 : pd3 = 0x00; 199 : 200 : /* XOUT XIN ボード上のLED none 201 : none VREF none none */ 202 : p4 = 0x20; /* P4_5のLED: 初期は点灯 */ 203 : pd4 = 0xb8; 204 : 205 : /* SW4 液晶 E 液晶 R/W 液晶 RS 206 : SW3or 液晶 D3 SW2or 液晶 D2 SW1or 液晶 D1 SW0or 液晶 D0 */ 207 : p5 = 0x00; 208 : pd5 = 0x7f; 209 : 210 : /* none none none none 211 : none none none none */ 212 : p6 = 0x00; 213 : pd6 = 0x00; 214 : 215 : /* CN6.2 入力 CN6.3 入力 CN6.4 入力 CN6.5 入力 216 : none( アナロク 予備 ) 角度 VR センサ _ 左アナロク センサ _ 右アナロク */ 217 : p7 = 0x00; 218 : pd7 = 0x00; 219 : 220 : /* DIPSWorLED DIPSWorLED DIPSWorLED DIPSWorLED 221 : DIPSWorLED DIPSWorLED DIPSWorLED DIPSWorLED */ 222 : pur2 = 0x03; /* P8_7~P8_0のプルアップON */ 223 : p8 = 0x00; 224 : pd8 = 0x00; 225 : 226 : /* - - フ ッシュスイッチ P8 制御 (LEDorSW) 227 : 右前 _Free 左前 _Free 右後 _Free 左後 _Free */ 228 : p9 = 0x00; 229 : pd9 = 0x1f; 230 : pu23 = 1; /* P9_4,P9_5をプルアップする */ 231 : 232 : /* A/Dコンバータの設定 */ 233 : admod = 0x33; /* 繰り返し掃引モードに設定 */ 234 : adinsel = 0xb0; /* 入力端子 P7の8 端子を選択 */ 235 : adcon1 = 0x30; /* A/D 動作可能 */ 236 : asm(" nop "); /* φadの1サイクルウエイト入れる */ 237 : adcon0 = 0x01; /* A/D 変換スタート */ 238 : 239 : /* タイマRBの設定 */ 240 : /* 割り込み周期 = 1 / 20[Hz] * (TRBPRE+1) * (TRBPR+1) 241 : = 1 / (20*10^6) * 50 * 100 242 : = 0.00025[s] = 0.25[ms] 243 : */ 244 : trbmr = 0x00; /* 動作モード 分周比設定 */ 245 : trbpre = 50-1; /* プリスケーラレジスタ */ 246 : trbpr = 100-1; /* プライマリレジスタ */ 247 : trbic = 0x06; /* 割り込み優先レベル設定 */ 248 : trbcr = 0x01; /* カウント開始 */ 249 : タイマ RB を使って 0.25ms ごとに割り込みを発生させるようにします 0.25ms ごとにコントローラ処理をします - 15 -

250 : /* タイマRC PWモード設定 ( 左前モータ 右前モータ ) */ 251 : trcpsr0 = 0x40; /* TRCIOA,B 端子の設定 */ 252 : trcpsr1 = 0x33; /* TRCIOC,D 端子の設定 */ 253 : trcmr = 0x0f; /* PWモード選択ビット設定 */ 254 : trccr1 = 0x8e; /* ソースカウント :f1, 初期出力の設定 */ 255 : trccr2 = 0x00; /* 出力レベルの設定 */ 256 : trcgra = TRC_OTOR_CYCLE - 1; /* 周期設定 */ 257 : trcgrb = trcgrb_buff = trcgra; /* P0_5 端子のON 幅 ( 左前モータ ) */ 258 : trcgrc = trcgra; /* P0_7 端子のON 幅 ( 予備 ) */ 259 : trcgrd = trcgrd_buff = trcgra; /* P0_6 端子のON 幅 ( 右前モータ ) */ 260 : trcic = 0x07; /* 割り込み優先レベル設定 */ 261 : trcier = 0x01; /* IIAを許可 */ 262 : trcoer = 0x01; /* 出力端子の選択 */ 263 : trcmr = 0x80; /* TRCカウント開始 */ 264 : 265 : /* タイマRD リセット同期 PWモード設定 ( 左後モータ 右後モータ サーホ モータ ) */ 266 : trdpsr0 = 0x08; /* TRDIOB0,C0,D0 端子設定 */ 267 : trdpsr1 = 0x05; /* TRDIOA1,B1,C1,D1 端子設定 */ 268 : trdmr = 0xf0; /* バッファレジスタ設定 */ 269 : trdfcr = 0x01; /* リセット同期 PWモードに設定 */ 270 : trdcr0 = 0x20; /* ソースカウントの選択 :f1 */ 271 : trdgra0 = trdgrc0 = TRD_OTOR_CYCLE - 1; /* 周期設定 */ 272 : trdgrb0 = trdgrd0 = 0; /* P2_2 端子のON 幅 ( 左後モータ ) */ 273 : trdgra1 = trdgrc1 = 0; /* P2_4 端子のON 幅 ( 右後モータ ) */ 274 : trdgrb1 = trdgrd1 = 0; /* P2_5 端子のON 幅 ( サーボモータ ) */ 275 : trdoer1 = 0xcd; /* 出力端子の選択 */ 276 : trdstr = 0x0d; /* TRD0カウント開始 */ 277 : 278 : #if 1 279 : // ifを1にすると この中を実行 280 : /* タイマRG タイマモード ( 両エッジでカウント ) の設定 */ 281 : timsr = 0x40; /* TRGCLKA 端子 P3_0に割り当てる */ 282 : trgcr = 0x15; /* TRGCLKA 端子の両エッジでカウント */ 283 : trgmr = 0x80; /* TRGのカウント開始 */ 284 : #else 285 : // ifを0にすると この中を実行 286 : /* タイマRG( 位相計数モード A 相,B 相で正転, 逆転検出 の設定 */ 287 : timsr = 0xc0; /* TRGCLKA,TRGCLKB 端子割り当て */ 288 : trgcntc = 0xff; /* 位相計数モート のカウント方法指定 */ 289 : trgmr = 0x82; /* TRGのカウント開始 */ 290 : #endif 291 : } 292 : 293 : /************************************************************************/ 294 : /* タイマRB 0.25msごとの割り込み処理 */ 295 : /************************************************************************/ 296 : #pragma interrupt /B inttrb(vect=24) 297 : void inttrb( void ) 298 : { 299 : static int trb_cnt = 0; /* 1msカウント用 */ 300 : static int itimer10 = 0; /* 10msカウント用 */ 301 : unsigned int i; 302 : 303 : trb_cnt++; 304 : 305 : asm(" fset I "); /* タイマRB 以上の割り込み許可 */ 306 : 307 : /* コントローラ処理 */ 308 : dsprocess(); 309 : 310 : if( trb_cnt >= 4 ) { 311 : /* 1msごとに実行 */ 312 : trb_cnt = 0; 313 : 314 : cnt1++; 315 : cnt_lcd++; 316 : 317 : /* モータ制御 */ 318 : motor2_r( m1_pwm, m2_pwm ); 319 : servopwmout( m3_pwm ); 320 : motor2_f( m4_pwm, m5_pwm ); 321 : 322 : /* 液晶表示処理用関数 (1msごとに実行) */ 323 : lcdshowprocess(); 324 : 325 : /* ブザー処理 */ 326 : beepprocesss(); 327 : 328 : /* 10 回中 1 回実行する処理 */ 329 : itimer10++; 330 : switch( itimer10 ) { 331 : case 1: 332 : /* タイマRGのエンコーダ制御 */ 333 : i = trg; 334 : iencoder = i - uencoderbuff; 335 : lencodertotal += iencoder; 336 : uencoderbuff = i; 337 : break; 338 : 1 にすると ロータリエンコーダ のパルスを 1 相分 マイコンに 入力します 接続は P3_0 端 子になります ( モータドライブ 基板 TypeS Ver.4 の CN9 の 2 ピン ) 0 にすると ロータリエンコーダ のパルスを 2 相分 マイコンに 入力します 接続は P3_0 端 子と P3_2 端子になります P3_2 端子はモータドライブ基 板 TypeS Ver.4 のコネクタから は出力されていないので マ イコンボードの CN5 の 7 ピンと 直接接続してください コントローラと 0.25ms ごとに通 信をして ボタン情報などを入力します 0.25ms ごとにプログラムを実 行すると マイコンの負荷が多 くなりすぎてプログラムの実行 が追いつかなくなることがある ので コントローラ処理以外 は 1ms ごとに実行します 5 個のモータを PW をセット するのは割り込み内で行って います - 16 -

339 : case 2: 340 : /* スイッチ読み込み準備 */ 341 : p9_4 = 0; /* LED 出力 OFF */ 342 : pd8 = 0x00; 343 : break; 344 : 345 : case 3: 346 : /* スイッチ読み込み LED 出力 */ 347 : types_dipsw = ~p8; /* ト ライフ 基板 TypeS Ver.4のSW 読み込み */ 348 : p8 = types_led; /* ト ライフ 基板 TypeS Ver.4のLEDへ出力 */ 349 : pd8 = 0xff; 350 : p9_4 = 1; /* LED 出力 ON */ 351 : break; 352 : 353 : case 4: 354 : break; 355 : 356 : case 5: 357 : break; 358 : 359 : case 6: 360 : break; 361 : 362 : case 7: 363 : break; 364 : 365 : case 8: 366 : break; 367 : 368 : case 9: 369 : break; 370 : 371 : case 10: 372 : /* itimer10 変数の処理 */ 373 : itimer10 = 0; 374 : break; 375 : } 376 : } 377 : } 378 : 379 : /************************************************************************/ 380 : /* タイマRC 割り込み処理 */ 381 : /************************************************************************/ 382 : #pragma interrupt inttrc(vect=7) 383 : void inttrc( void ) 384 : { 385 : trcsr &= 0xfe; 386 : 387 : /* タイマRC デューティ比の設定 */ 388 : trcgrb = trcgrb_buff; 389 : trcgrd = trcgrd_buff; 390 : } 391 : 392 : /************************************************************************/ 393 : /* マイコンボード上のディップスイッチ値読み込み */ 394 : /* 引数 なし */ 395 : /* 戻り値スイッチ値 0~15 */ 396 : /************************************************************************/ 397 : unsigned char dipsw_get( void ) 398 : { 399 : unsigned char sw; 400 : 401 : sw = p1 & 0x0f; /* P1_3~P1_0 読み込み */ 402 : 403 : return sw; 404 : } 405 : 406 : /************************************************************************/ 407 : /* モータドライブ基板 TypeS Ver.4 上のディップスイッチ値読み込み */ 408 : /* 引数 なし */ 409 : /* 戻り値スイッチ値 0~255 */ 410 : /************************************************************************/ 411 : unsigned char dipsw_get2( void ) 412 : { 413 : /* 実際の入力はタイマRB 割り込み処理で実施 */ 414 : return types_dipsw; 415 : } 416 : 417 : /************************************************************************/ 418 : /* モータドライブ基板 TypeS Ver.4 上のプッシュスイッチ値読み込み */ 419 : /* 引数 なし */ 420 : /* 戻り値スイッチ値 0:OFF 1:ON */ 421 : /************************************************************************/ 422 : unsigned char pushsw_get( void ) 423 : { 424 : unsigned char sw; 425 : 426 : sw = ~p9_5 & 0x01; 427 : 428 : return sw; 429 : } - 17 -

430 : 431 : /************************************************************************/ 432 : /* モータドライブ基板 TypeS Ver.4のCN6の状態読み込み */ 433 : /* 引数 なし */ 434 : /* 戻り値 0~15 */ 435 : /************************************************************************/ 436 : unsigned char cn6_get( void ) 437 : { 438 : unsigned char data; 439 : 440 : data = p7 >> 4; 441 : 442 : return data; 443 : } 444 : 445 : /************************************************************************/ 446 : /* モータドライブ基板 TypeS Ver.4のLED 制御 */ 447 : /* 引数 8 個のLED 制御 0:OFF 1:ON */ 448 : /* 戻り値なし */ 449 : /************************************************************************/ 450 : void led_out( unsigned char led ) 451 : { 452 : /* 実際の出力はタイマRB 割り込み処理で実施 */ 453 : types_led = led; 454 : } 455 : 456 : /************************************************************************/ 457 : /* 後輪の速度制御 2 ディップスイッチには関係しないmotor 関数 */ 458 : /* 引数 左モータ :-100~100, 右モータ :-100~100 */ 459 : /* 0で停止 100で正転 100% -100で逆転 100% */ 460 : /* 戻り値なし */ 461 : /************************************************************************/ 462 : void motor2_r( int accele_l, int accele_r ) 463 : { 464 : /* 左後モータ */ 465 : if( accele_l >= 0 ) { 466 : p2_1 = 0; 467 : trdgrd0 = (long)( TRD_OTOR_CYCLE - 2 ) * accele_l / 100; 468 : } else { 469 : p2_1 = 1; 470 : trdgrd0 = (long)( TRD_OTOR_CYCLE - 2 ) * ( -accele_l ) / 100; 471 : } 472 : 473 : /* 右後モータ */ 474 : if( accele_r >= 0 ) { 475 : p2_3 = 0; 476 : trdgrc1 = (long)( TRD_OTOR_CYCLE - 2 ) * accele_r / 100; 477 : } else { 478 : p2_3 = 1; 479 : trdgrc1 = (long)( TRD_OTOR_CYCLE - 2 ) * ( -accele_r ) / 100; 480 : } 481 : } 482 : 483 : /************************************************************************/ 484 : /* 前輪の速度制御 2 ディップスイッチには関係しないmotor 関数 */ 485 : /* 引数 左モータ :-100~100, 右モータ :-100~100 */ 486 : /* 0で停止 100で正転 100% -100で逆転 100% */ 487 : /* 戻り値なし */ 488 : /************************************************************************/ 489 : void motor2_f( int accele_l, int accele_r ) 490 : { 491 : /* 左前モータ */ 492 : if( accele_l >= 0 ) { 493 : p2_0 = 0; 494 : } else { 495 : p2_0 = 1; 496 : accele_l = -accele_l; 497 : } 498 : if( accele_l <= 5 ) { 499 : trcgrb = trcgrb_buff = trcgra; 500 : } else { 501 : trcgrb_buff = (unsigned long)(trc_otor_cycle-2) * accele_l / 100; 502 : } 503 : 504 : /* 右前モータ */ 505 : if( accele_r >= 0 ) { 506 : p2_7 = 0; 507 : } else { 508 : p2_7 = 1; 509 : accele_r = -accele_r; 510 : } 511 : if( accele_r <= 5 ) { 512 : trcgrd = trcgrd_buff = trcgra; 513 : } else { 514 : trcgrd_buff = (unsigned long)(trc_otor_cycle-2) * accele_r / 100; 515 : } 516 : } 517 : - 18 -

518 : /************************************************************************/ 519 : /* 後モータ停止動作 ( ブレーキ フリー ) */ 520 : /* 引数 左モータ :FREE or BRAKE, 右モータ :FREE or BRAKE */ 521 : /* 戻り値なし */ 522 : /************************************************************************/ 523 : void motor_mode_r( int mode_l, int mode_r ) 524 : { 525 : if( mode_l ) { 526 : p9_0 = 1; 527 : } else { 528 : p9_0 = 0; 529 : } 530 : if( mode_r ) { 531 : p9_1 = 1; 532 : } else { 533 : p9_1 = 0; 534 : } 535 : } 536 : 537 : /************************************************************************/ 538 : /* 前モータ停止動作 ( ブレーキ フリー ) */ 539 : /* 引数 左モータ :FREE or BRAKE, 右モータ :FREE or BRAKE */ 540 : /* 戻り値なし */ 541 : /************************************************************************/ 542 : void motor_mode_f( int mode_l, int mode_r ) 543 : { 544 : if( mode_l ) { 545 : p9_2 = 1; 546 : } else { 547 : p9_2 = 0; 548 : } 549 : if( mode_r ) { 550 : p9_3 = 1; 551 : } else { 552 : p9_3 = 0; 553 : } 554 : } 555 : 556 : /************************************************************************/ 557 : /* サーボモータ制御 */ 558 : /* 引数 サーボモータPW:-100~100 */ 559 : /* 0で停止 100で正転 100% -100で逆転 100% */ 560 : /* 戻り値なし */ 561 : /************************************************************************/ 562 : void servopwmout( int pwm ) 563 : { 564 : if( pwm >= 0 ) { 565 : p2_6 = 0; 566 : trdgrd1 = (long)( TRD_OTOR_CYCLE - 2 ) * pwm / 100; 567 : } else { 568 : p2_6 = 1; 569 : trdgrd1 = (long)( TRD_OTOR_CYCLE- 2 ) * ( -pwm ) / 100; 570 : } 571 : } 572 : 573 : /************************************************************************/ 574 : /* end of file */ 575 : /************************************************************************/ - 19 -

4.3 R8C/38A マイコンで使用する内蔵周辺機能 機能 SSU タイマ RB タイマ RC タイマ RD タイマ RG 詳細 コントローラと信号のやり取りを行います 2 台目以降の場合は 1 台目からの信号を受信します 0.25[ms] ごとの割り込み用として使用しています モータドライブ基板 TypeS Ver.4 の左前モータ (CN13) 右前モータ (CN14) のモータを制御しています リセット同期 PW モードとして使用して 左後モータ (CN10) 右後モータ (CN11) サーボモータ (CN12) のモータを制御します P3_0 端子からのパルスカウントとして使用します 立ち上がり 立ち下がりの両方でカウントします ロボットに使うと 移動速度や 移動距離が分かりますが 前進しているか後進しているかは分かりません 位相計数モードというモードに設定し ロータリエンコーダ の A 相 B 相の信号を P3_0 端子 P3_2 端子に入力すると 正転 ( 前進 ) 逆転 ( 後進 ) が分かります - 20 -

5. 大電流モータを接続する 5.1 FET の選定 モータドライブ基板 TypeS Ver.4 は マイコンカーラリー承認の指定モータは駆動できますが それ以上電流の流れるモータは FET の容量が足りず FET が焼けてしまいます キットに入っている FET と 市販されていて交換できそうな FET を下表に示します P チャンネル (2SJ タイプ ) N チャネル (2SK タイプ ) キットの FET 秋月電子通商 2SJ530(L) ドレイン-ソース電圧 :60V ドレイン電流 :15A 2SJ471 ドレイン-ソース電圧 :30V ドレイン電流 :30A http://akizukidenshi.com/catalog/g/gi-00034/ 2SK2869(L) ドレイン-ソース電圧 :60V ドレイン電流 :20A H7N0308CF ドレイン-ソース電圧 :30V ドレイン電流 :60A http://akizukidenshi.com/catalog/g/gi-01110/ 選定方法は ピンの順番が ゲート (G) ドレイン(D) ソース(S) で ピン間が 2.54mm であればほとんどの FET は使用できます 5.2 取り付け方法 モータドライブ基板 TypeS Ver.4 は FET と FET の実装間隔が狭く TO-220 パッケージの FET を取り付けることができません そのため 苦肉の策ですが FET を 2SJ タイプは部品面から取り付け 2SK タイプは半田面から取り付けると基板に実装することができます もちろん 半田面に FET を取り付けることになりますので ロボットに固定するときは 空きスペースを確保してください - 21 -

5.3 その他の改造ポイント モータドライブ基板 TypeS Ver.4 の FET 交換以外の改造ポイントを 下記に示します 大電流が流れてもロスの少ない ( 内部抵抗の少ない ) ラジコン用のコネクタにします VH コネクタは使いません スイッチは内部抵抗が大きいので取り外し ショートします スイッチが無いと不便なので マイコンの電源を ON/OFF するスイッチを追加します 10 分以上使わない場合は 電池を抜いてください VBAT GND パターンだけでは電流が流せないので 線で直接配線します FET 部分は細かく半田づけが大変なので 数カ所程度で大丈夫です - 22 -

6. 参考文献 ルネサスエレクトロニクス ( 株 ) R8C/38C グループユーザーズマニュアルハードウェア編 Rev.1.10 ルネサスエレクトロニクス ( 株 ) 16C シリーズ,R8C ファミリ用 C/C++ コンパイラパッケージ V.6.00 C/C++ コンパイラユーザーズマニュアル Rev.1.00 ルネサスエレクトロニクス ( 株 ) High-performance Embedded Workshop V.4.09 ユーザーズマニュアル Rev.1.00 ルネサス半導体トレーニングセンター C 言語入門コーステキスト第 1 版 電波新聞社マイコン入門講座大須賀威彦著第 1 版 ソフトバンク( 株 ) 新 C 言語入門シニア編林晴比古著初版 共立出版( 株 ) プログラマのための ANSI C 全書 L.Ammeraal 著吉田敬一 竹内淑子 吉田恵美子訳初版 プレイステーション PAD/ メモリ インターフェースの解析 Nifty-ID:HFB03536 藤田 http://kaele.com/~kashima/games/ps_jpn.txt デュアルショック 2(SCPH-10010) の新機能使用方法 http://applause.elfmimi.jp/dualshock/millar/nt/dualshock_2.txt マイコンカーラリー 販売部品についての詳しい情報は マイコンカーラリー販売サイトをご覧ください https://www2.himdx.net/mcr/ R8C マイコンについての詳しい情報は ルネサスエレクトロニクス ( 株 ) のホームページをご覧ください http://japan.renesas.com/ の製品情報にある マイコン R8C でご覧頂けます - 23 -