Library to use Arduino USB host shield on mbed
ArduinoのUSB Host Shield 2.0をmbedで使えるようにしたライブラリです。
大体のコードがArduinoからそのまま移植可能です。
Arduino UNOやMega用のホストシールド以外にもミニサイズのホストシールドでも使用可能です

シールドについて
3.3VのI/O用にシールドの改造が必要になりますがネット上に記事がたくさんあるのでそちらを参考にしてください
接続例

使い方
Arduinoのコードと違うのはUSBのインスタンスの宣言部分のみです。
ピンを自分で指定できるようにしたので使いやすくなりました。
仕様
- Arduinoのmillis関数、micros関数の移植のために内部でTimerクラスを使用しています。
main.cpp
#include "mbed.h"
#include <PS3BT.h>
#include <usbhub.h>
Serial pc(USBTX, USBRX, 115200);
//Nucleo f303k8用
USB Usb(A6, A5, A4, A3, A2); // mosi, miso, sclk, ssel, intr
BTD Btd(&Usb);
PS3BT PS3(&Btd);
int main()
{
bool printAngle = false;
if (Usb.Init() == -1)
{
pc.printf("\r\nOSC did not start");
while (1); // Halt
}
pc.printf("\r\nPS3 USB Library Started");
while (1)
{
Usb.Task();
if (PS3.PS3Connected || PS3.PS3NavigationConnected) {
if (PS3.getAnalogHat(LeftHatX) > 137 || PS3.getAnalogHat(LeftHatX) < 117 || PS3.getAnalogHat(LeftHatY) > 137 || PS3.getAnalogHat(LeftHatY) < 117 || PS3.getAnalogHat(RightHatX) > 137 || PS3.getAnalogHat(RightHatX) < 117 || PS3.getAnalogHat(RightHatY) > 137 || PS3.getAnalogHat(RightHatY) < 117)
{
pc.printf("\r\nLeftHatX: %d", PS3.getAnalogHat(LeftHatX));
pc.printf("\tLeftHatY: %d", PS3.getAnalogHat(LeftHatY));
if (PS3.PS3Connected)
{ // The Navigation controller only have one joystick
pc.printf("\tRightHatX: %d", PS3.getAnalogHat(RightHatX));
pc.printf("\tRightHatY: %d", PS3.getAnalogHat(RightHatY));
}
}
// Analog button values can be read from almost all buttons
if (PS3.getAnalogButton(L2) || PS3.getAnalogButton(R2))
{
pc.printf("\r\nL2: %d", PS3.getAnalogButton(L2));
if (!PS3.PS3NavigationConnected)
{
pc.printf("\tR2: %d", PS3.getAnalogButton(R2));
}
}
if (PS3.getButtonClick(PS))
{
PS3.disconnect();
pc.printf("\r\nPS");
}
if (PS3.getButtonClick(TRIANGLE))
pc.printf("\r\nTriangle");
if (PS3.getButtonClick(CIRCLE))
pc.printf("\r\nCircle");
if (PS3.getButtonClick(CROSS))
pc.printf("\r\nCross");
if (PS3.getButtonClick(SQUARE))
pc.printf("\r\nSquare");
if (PS3.getButtonClick(UP))
{
pc.printf("\r\nUp");
PS3.setLedOff();
PS3.setLedOn(CONTROLLER_LED4);
}
if (PS3.getButtonClick(RIGHT))
{
pc.printf("\r\nRight");
PS3.setLedOff();
PS3.setLedOn(CONTROLLER_LED1);
}
if (PS3.getButtonClick(DOWN))
{
pc.printf("\r\nDown");
PS3.setLedOff();
PS3.setLedOn(CONTROLLER_LED2);
}
if (PS3.getButtonClick(LEFT))
{
pc.printf("\r\nLeft");
PS3.setLedOff();
PS3.setLedOn(CONTROLLER_LED3);
}
if (PS3.getButtonClick(L1))
pc.printf("\r\nL1");
if (PS3.getButtonClick(L3))
pc.printf("\r\nL3");
if (PS3.getButtonClick(R1))
pc.printf("\r\nR1");
if (PS3.getButtonClick(R3))
pc.printf("\r\nR3");
if (PS3.getButtonClick(SELECT))
{
pc.printf("\r\nSelect - ");
PS3.printStatusString();
}
if (PS3.getButtonClick(START))
{
pc.printf("\r\nStart");
printAngle = !printAngle;
}
if (printAngle)
{
pc.printf("\r\nPitch: %.3lf", PS3.getAngle(Pitch));
pc.printf("\tRoll: %.3lf", PS3.getAngle(Roll));
}
}
else
{
pc.printf("not connect\n");
}
}
}
Revision 1:da31140f2a1c, committed 2020-05-02
- Comitter:
- robo_ichinoseki_a
- Date:
- Sat May 02 05:56:48 2020 +0000
- Parent:
- 0:b1ce54272580
- Commit message:
- update
Changed in this revision
--- a/Arduino_lib/Arduino.h Sat Jan 18 15:06:35 2020 +0000 +++ b/Arduino_lib/Arduino.h Sat May 02 05:56:48 2020 +0000 @@ -18,7 +18,7 @@ #define PI M_PI #define RAD_TO_DEG (180.0 / M_PI) -#define delay(ms) wait_ms(ms) +#define delay(ms) wait_us(ms*1000) #define delayMicroseconds(us) wait_us(us) #define millis() (USB::read_ms()) #define micros() (USB::read_us())
--- a/Arduino_lib/arStream.cpp Sat Jan 18 15:06:35 2020 +0000 +++ b/Arduino_lib/arStream.cpp Sat May 02 05:56:48 2020 +0000 @@ -29,7 +29,7 @@ #define PARSE_TIMEOUT 1000 // default number of milli-seconds to wait #define NO_SKIP_CHAR 1 // a magic char not found in a valid ASCII numeric field -extern Timer USB::arduinoTimer; +//extern Timer USB::arduinoTimer; // private method to read stream with timeout int arStream::timedRead()
--- a/USB_Host/PS3USB.cpp Sat Jan 18 15:06:35 2020 +0000
+++ b/USB_Host/PS3USB.cpp Sat May 02 05:56:48 2020 +0000
@@ -44,7 +44,7 @@
my_bdaddr[1] = btadr1;
my_bdaddr[0] = btadr0;
- printf("Constractor\n");
+ //printf("Constractor\n");
}
uint8_t PS3USB::Init(uint8_t parent, uint8_t port, bool lowspeed) {
--- a/USB_Host/Usb.cpp Sat Jan 18 15:06:35 2020 +0000 +++ b/USB_Host/Usb.cpp Sat May 02 05:56:48 2020 +0000 @@ -22,6 +22,8 @@ #include "Usb.h" +Timer USB::arduinoTimer; + static uint8_t usb_error = 0; static uint8_t usb_task_state;
--- a/USB_Host/UsbCore.h Sat Jan 18 15:06:35 2020 +0000
+++ b/USB_Host/UsbCore.h Sat May 02 05:56:48 2020 +0000
@@ -310,7 +310,7 @@
return ( ctrlReq(addr, ep, bmREQ_SET, USB_REQUEST_SET_CONFIGURATION, conf_value, 0x00, 0x0000, 0x0000, NULL));
}
-Timer USB::arduinoTimer;
+//Timer USB::arduinoTimer;
#endif // defined(USB_METHODS_INLINE)
--- a/USB_Host/printhex.h Sat Jan 18 15:06:35 2020 +0000
+++ b/USB_Host/printhex.h Sat May 02 05:56:48 2020 +0000
@@ -1,92 +1,94 @@
-/* Copyright (C) 2011 Circuits At Home, LTD. All rights reserved.
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-Contact information
--------------------
-
-Circuits At Home, LTD
-Web : http://www.circuitsathome.com
-e-mail : support@circuitsathome.com
- */
-
-#if !defined(_usb_h_) || defined(__PRINTHEX_H__)
-#error "Never include printhex.h directly; include Usb.h instead"
-#else
-#define __PRINTHEX_H__
-
-void E_Notifyc(char c, int lvl);
-
-template <class T>
-void PrintHex(T val, int lvl) {
- int num_nibbles = sizeof (T) * 2;
-
- do {
- char v = 48 + (((val >> (num_nibbles - 1) * 4)) & 0x0f);
- if(v > 57) v += 7;
- E_Notifyc(v, lvl);
- } while(--num_nibbles);
-}
-
-template <class T>
-void PrintBin(T val, int lvl) {
- for(T mask = (((T)1) << ((sizeof (T) << 3) - 1)); mask; mask >>= 1)
- if(val & mask)
- E_Notifyc('1', lvl);
- else
- E_Notifyc('0', lvl);
-}
-
-template <class T>
-void SerialPrintHex(T val) {
- int num_nibbles = sizeof (T) * 2;
-
- do {
- char v = 48 + (((val >> (num_nibbles - 1) * 4)) & 0x0f);
- if(v > 57) v += 7;
- USB_HOST_SERIAL.print(v);
- } while(--num_nibbles);
-}
-
-template <class T>
-void PrintHex2(Print *prn, T val) {
- T mask = (((T)1) << (((sizeof (T) << 1) - 1) << 2));
-
- while(mask > 1) {
- if(val < mask)
- prn->print("0");
-
- mask >>= 4;
- }
- prn->print((T)val, HEX);
-}
-
-template <class T> void D_PrintHex(T val __attribute__((unused)), int lvl __attribute__((unused))) {
-#ifdef DEBUG_USB_HOST
- PrintHex<T > (val, lvl);
-#endif
-}
-
-template <class T>
-void D_PrintBin(T val, int lvl) {
-#ifdef DEBUG_USB_HOST
- PrintBin<T > (val, lvl);
-#endif
-}
-
-
-
-#endif // __PRINTHEX_H__
+/* Copyright (C) 2011 Circuits At Home, LTD. All rights reserved.
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+Contact information
+-------------------
+
+Circuits At Home, LTD
+Web : http://www.circuitsathome.com
+e-mail : support@circuitsathome.com
+ */
+
+#include <stdio.h>
+
+#if !defined(_usb_h_) || defined(__PRINTHEX_H__)
+#error "Never include printhex.h directly; include Usb.h instead"
+#else
+#define __PRINTHEX_H__
+
+void E_Notifyc(char c, int lvl);
+
+template <class T>
+void PrintHex(T val, int lvl) {
+ int num_nibbles = sizeof (T) * 2;
+
+ do {
+ char v = 48 + (((val >> (num_nibbles - 1) * 4)) & 0x0f);
+ if(v > 57) v += 7;
+ E_Notifyc(v, lvl);
+ } while(--num_nibbles);
+}
+template <class T>
+void PrintBin(T val, int lvl) {
+ for(T mask = (((T)1) << ((sizeof (T) << 3) - 1)); mask; mask >>= 1)
+ if(val & mask)
+ E_Notifyc('1', lvl);
+ else
+ E_Notifyc('0', lvl);
+}
+
+template <class T>
+void SerialPrintHex(T val) {
+ int num_nibbles = sizeof (T) * 2;
+
+ do {
+ char v = 48 + (((val >> (num_nibbles - 1) * 4)) & 0x0f);
+ if(v > 57) v += 7;
+ //print(v);
+ } while(--num_nibbles);
+}
+
+template <class T>
+void PrintHex2(Print *prn, T val) {
+ T mask = (((T)1) << (((sizeof (T) << 1) - 1) << 2));
+
+ while(mask > 1) {
+ if(val < mask)
+ prn->print("0");
+
+ mask >>= 4;
+ }
+ prn->print((T)val, HEX);
+}
+
+template <class T> void D_PrintHex(T val __attribute__((unused)), int lvl __attribute__((unused))) {
+#ifdef DEBUG_USB_HOST
+ PrintHex<T > (val, lvl);
+#endif
+}
+
+template <class T>
+void D_PrintBin(T val, int lvl) {
+#ifdef DEBUG_USB_HOST
+ PrintBin<T > (val, lvl);
+#endif
+}
+
+
+
+#endif // __PRINTHEX_H__
+
--- a/USB_Host/settings.h Sat Jan 18 15:06:35 2020 +0000 +++ b/USB_Host/settings.h Sat May 02 05:56:48 2020 +0000 @@ -52,7 +52,7 @@ * For example Serial3. */ -#define USB_HOST_SERIAL ; // +#define USB_HOST_SERIAL // #ifndef USB_HOST_SERIAL #define USB_HOST_SERIAL // #endif