RAMPS + A4988 driver + ステッピングモータSM-42BYG011について

RAMPSでステッピングモータを使うため、秋月でお手頃なのを見つけました。akizukidenshi.com


モータドライバにはSainMartのA4988を利用しました。
電流調整は定格電流が0.33Aだったので、電流値の計算は測定電圧×2.5らしいので0.132Vぐらいになるように調整しました。

いざprintrunで動かしたところ、モータが空回り?(脱調というのでしょうか)して動かない。
いろいろ試行錯誤したところ、モータを動かす速度に問題があることが判明。
既定値では1500 mm/minとなるが、これが早すぎるらしい。
速度を遅くし過ぎても、ガタガタと音がして正常に動作しない。
いろいろ速度を変えてみたところ、400mm/minが一番スムーズに動くことを確認。

今回はかなりはまりました。
いろいろ無茶したせいで、opt endstopを壊してしまいました。また購入しないといけないなー

USBシリアルデバイスの権限設定

ubuntu3Dプリンタを使用する際、USBシリアルデバイスを使うのですが、
毎回デバイスのread/write権を設定するのが面倒になってきたので。

まずはシリアルデバイスの情報を確認します。
この時点でotherに対して権限はありません。

$ ls -la /dev/ttyACM0 
crw-rw---- 1 root dialout 166, 0  5月  5 17:28 /dev/ttyACM0


USBデバイスIDを確認します。

$ lsusb
Bus 004 Device 002: ID 8087:8000 Intel Corp. 
Bus 004 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 003 Device 002: ID 8087:8008 Intel Corp. 
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 007: ID 2341:0042 Arduino SA Mega 2560 R3 (CDC ACM)
Bus 001 Device 003: ID 062a:410c Creative Labs 
Bus 001 Device 002: ID 04f3:0103 Elan Microelectronics Corp. ActiveJet K-2024 Multimedia Keyboard
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

udevのカスタマイズルールファイルを作成します。*1

$ls /etc/udev/rules.d/50-udev.rules
ls: /etc/udev/rules.d/50-udev.rules にアクセスできません: そのようなファイルやディレクトリはありません
$ sudo vi /etc/udev/rules.d/50-udev.rules
KERNEL=="ttyACM*", ATTRS{idVendor}=="2341", ATTRS{idProduct}=="0042", GROUP="dialout", MODE="0666"

USBデバイスを再接続し、ちゃんと権限設定されるか確認します。

$ ls -la /dev/ttyACM0 
crw-rw-rw- 1 root dialout 166, 0  5月  5 18:13 /dev/ttyACM0

おお、いい感じになっているやん。
これでまた一つlazyになったわ。

ListFragmentからFragmentを表示する方法

ListFragmentのリスト選択時、詳細な情報を別Fragmentで表示したいときがあります。
試行錯誤しながら、なんとか実現できたので備忘録として残しておきます。

ラッパー用のFragmentを容易し、その中にListFragment、およびFragmentを表示する方法になります。
ラッパー用のlayoutファイルfragment_wrapper.xmlは以下のようになります。

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    
    <FrameLayout 
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
</FrameLayout>


ラッパー用のFragmentは以下のようにします。
リスト選択時、getChildFragmentManagerで詳細画面用のFragmentに置き換えます。

public class WrapperFragment extends Fragment {
	
	public static WrapperFragment newInstance(int position){
		WrapperFragment fragment = new WrapperFragment();
		Bundle bundle = new Bundle();
		bundle.putInt("position", position);
		return fragment;
	}
	
	@Override
	public void onCreate(Bundle savedInstanceState){
		logger.put(android.util.Log.INFO,TAG,"onCreate");
		super.onCreate(savedInstanceState);
		
		DataListFragment list = DataListFragment.newInstance(1,new DataListListener(){
			@Override
			public void onSwitchToNextFragment(){
				DetailFragment fragment = DetailFragment.newInstance(1);
				getChildFragmentManager().beginTransaction()
					.replace(R.id.container, fragment)
					.addToBackStack(null)
					.commit();
			}
		});
		getChildFragmentManager().beginTransaction()
			.add(R.id.container, list)
			.commit();
	}
	
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
		logger.put(android.util.Log.INFO,TAG,"onCreateView");
		View view = inflater.inflate(R.layout.fragment_wrapper, container, false);
		return view;
	}

DataListFragmentは以下のとおりになります。

	@Override
	public void onListItemClick(ListView l, View v, int position, long id){
        ...省略...
          if(mListener != null) {
            mListener.onSwitchToNextFragment();
          }		
	}

解決するのに時間がかかりました。疲れた。

バックボタンを押したとき、ネストしたFragmentをバックスタックする方法

FragmentからFragmentを呼ぶ(いわゆるNested Fragment)場合、バックボタンを押したとき、一個前のFragmentに戻したいときがあります。
stackoverflowでいいものを見つけたので、備忘録としてメモしておきます。
Android 4.2: back stack behaviour with nested fragments - Stack Overflow

Fragment呼び出し時

当たり前のことなのですが、Fragment呼び出し時は後で復元できるようにaddToBackStackを呼んでスタック*1に追加しておきます。

	@Override
	public void onCreate(Bundle savedInstanceState){
		logger.put(android.util.Log.INFO,TAG,"onCreate");
		super.onCreate(savedInstanceState);
		
		DataListFragment list = DataListFragment.newInstance(1,new DataListListener(){
			@Override
			public void onSwitchToNextFragment(){
				DetailFragment fragment = DetailFragment.newInstance(1);
				getChildFragmentManager().beginTransaction()
					.replace(R.id.container, fragment)
					.addToBackStack(null)
					.commit();
			}
		});
		getChildFragmentManager().beginTransaction()
			.add(R.id.container, list)
			.commit();
	}

バックボタンを押したときの処理

以下のようにしてNetsted Fragmentのスタックが存在する場合は、popBackStackを呼んで1つ前の状態の戻しします。

	@Override
	public void onBackPressed() {
	    // if there is a fragment and the back stack of this fragment is not empty,
	    // then emulate 'onBackPressed' behaviour, because in default, it is not working
	    FragmentManager fm = getSupportFragmentManager();
	    for (Fragment frag : fm.getFragments()) {
	        if (frag.isVisible()) {
	            FragmentManager childFm = frag.getChildFragmentManager();
	            if (childFm.getBackStackEntryCount() > 0) {
	                childFm.popBackStack();
	                return;
	            }
	        }
	    }
	    super.onBackPressed();
	}

statckoverflowに感謝、感謝です。

*1:正式な用語はトランザクションというようです

Google Play Game Serviceの使い方

Google Play Game Service APIを利用することでゲーム対戦機能、リーダーボード、アーチーブメント機能を利用できます。
以下にサンプルプログラムを利用する手順を備忘録として書いておきます。

Step1.Google Play Serviceをインストール

まず開発PCにGoogle Play Serviceのライブラリがインストールされていない場合はSDK Managerを使用してインストールします。
f:id:mondayboy:20141130233553p:plain

Step2.lib_projectインポート

1でインストールした{$ANDROID_SDK}/extras/google/google_play_services/lib_project/google-play-services_libをEclipseへインポートします。
f:id:mondayboy:20141221102053p:plain

Step3.サンプルソースを取得

リポジトリよりサンプルソースを取得します。

git clone https://github.com/playgameservices/android-samples.git play_game_services

Step4.GameBaseUtilライブラリプロジェクトインポート

  1. Step3で取得したソースにGameBaseUtilsをインポートします。
    f:id:mondayboy:20141221102107p:plain
  2. プロジェクトの[Properties]-[Android]より、google play service libの参照を追加し、[Is Library]のチェックをオンにします。
    f:id:mondayboy:20141221102106p:plain

Step5.デバッグキーストアの生成

  1. ターミナルから以下のコマンドを実行すると、パスワードの入力を求められるのでパスワードを入力し、debug.keystoreを生成します。*1

keytool -genkey -v -keystore debug.keystore -alias androiddebugkey -keyalg RSA -validity 10000 -dname "CN=Android Debug,O=Android,C=US"

Step6.証明書作成

  1. 作成したデバッグキーストアより証明書*2を作成します。

# keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore -list -v
Unable to find a $JAVA_HOME at "/usr", continuing with system-provided Java...
キーストアのパスワードを入力してください:
別名: androiddebugkey
作成日: 2014/12/02
エントリタイプ: PrivateKeyEntry
証明連鎖の長さ: 1
証明書[1]:
所有者: CN=Android Debug, O=Android, C=US
発行者: CN=Android Debug, O=Android, C=US
シリアル番号: 547ceee6
有効期間の開始日: Tue Dec 02 07:42:46 JST 2014 終了日: Sat Apr 19 07:42:46 JST 2042
証明書のフィンガープリント:
MD5: F4:DD:E2:C2:24:5F:47:4B:58:E5:60:2D:90:AD:05:A6
SHA1: 2D:A6:C0:8B:EB:B6:32:97:9E:B1:7C:7D:31:C7:7A:6E:D2:AA:73:87
署名アルゴリズム名: SHA1withRSA
バージョン: 3

Step7.Google Play Developer Console設定

  1. コンソール(https://play.google.com/apps/publish/)より、[新しいゲームの追加]を選択します。
    f:id:mondayboy:20141221102054p:plain
  2. ゲーム名を入力し[次へ]を選択します。
    f:id:mondayboy:20141221102103p:plain
  3. 以下の画面が表示されるので、[説明文]を入力し[保存]を選択します。
    f:id:mondayboy:20141221102102p:plain
  4. 以下の画面が表示されるので、[android]を選択します。
    f:id:mondayboy:20141221102101p:plain
  5. 以下の画面が表示されるので、[パッケージ名]を入力し、[保存して次へ]を選択します。
    f:id:mondayboy:20141221102100p:plain
  6. 以下の画面が表示されるので、[今すぐアプリを承認]を選択します。
    f:id:mondayboy:20141221102059p:plain
  7. 以下の画面が表示されるので、[Continue]を選択します。
    f:id:mondayboy:20141221102058p:plain
  8. 以下の画面が表示されるので[SHA1]を入力し、[Create Client]を選択します。(クライアントIDの再作成はhttps://console.developers.google.com/projectより編集することができます)
    f:id:mondayboy:20141221102057p:plain
  9. 以下の画面が表示されるので、アプリIDをメモしておきます。
    f:id:mondayboy:20141221102056p:plain

Step8.サンプルソースインポート

  1. サンプルソースButtonClickerをインポートします。
    f:id:mondayboy:20141221102105p:plain
  2. プロジェクトの[Properties]-[Android]より、goole play service libとBaseGameUtilのライブラリプロジェクトを追加します。
    f:id:mondayboy:20141221102104p:plain
  3. Step7-9でメモしておいたクライアントIDをids.xmlに反映します。
  4. パッケージを作成する際に使用するキーはStep6で作成したデバッグキーを使用します。
  5. サンプルプログラム(ButtonClicker)を端末にインストールすると以下のように使用できます。
    f:id:mondayboy:20141221143839p:plain

*1:表示文字が文字化けする場合は、ターミナルの文字コードをShift-JISに設定します。

*2:SH1のハッシュ値

Google Fit への挑戦

ダークサイド脱出

最近ダークサイドに落ちてたため、何かやる気を起こさせるものはないかと考えていたところ、
Googleからの挑戦状が....
f:id:mondayboy:20141208011359p:plain

ちょうどいいタイミングやし、チャレンジしてみます。

Google Fitでなにができるのか?

1.The fitness store

googleクラウド上に永続的に保存可能なデータストア。
APIを使用して簡単にデータの追加、検索することが可能。

2.The sensor framework

フレームワークにより、センサー情報、セッション等の管理が容易になる

3.Permissions and user controls

アプリケーションに応じた柔軟なアクセス制御が可能

これだけではよく分からないので、とりあえずサンプルを使ってみよう!!!

Step1 Google Play Serviceインストール確認

  1. まず端末にGoogle Play Service(開発者サービス)がインストールされているか確認します。Google Play ServiceはGoogleサービスへの認証、同期といったコアな機能を持っており、Google FitではGoogle Play Serviceの機能を利用しているため、必要となります。確認方法は端末の設定画面(Settings > Apps > Google Play services)から確認可能です。日本語ではGoogle Play 開発者サービスと表示されます。
  2. 開発PCにGoogle Play Serviceのライブラリがインストールされていない場合はSDK Managerを使用してインストールします。f:id:mondayboy:20141130234054p:plain

今後のことも考え、以下のパッケージをインストールしました。
(a) Android SDK Tools
(b) Android SDK Platform-tools
(c) Android Support Repository
(d) Android Support Library
(e) Google Play Service
(f) Google Repository

Step2 Googleアカウント取得

Google Fitness APIを使用するために、Gooogleアカウントが必須なので、アカウントを作成します。

Step3 Google Fitness API有効化

  1. Developer Consoleから新規にプロジェクトを作成します。f:id:mondayboy:20141202063327p:plain
  2. 一覧からFitness APIを選択し、有効化します。f:id:mondayboy:20141202064451p:plain

Step4 デバッグキーストアの生成

  1. ターミナルから以下のコマンドを実行すると、パスワードの入力を求められるのでパスワードを入力し、debug.keystoreを生成します。*1

keytool -genkey -v -keystore debug.keystore -alias androiddebugkey -keyalg RSA -validity 10000 -dname "CN=Android Debug,O=Android,C=US"

Step5 証明書作成

  1. 作成したデバッグキーストアより証明書*2を作成します。

# keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore -list -v
Unable to find a $JAVA_HOME at "/usr", continuing with system-provided Java...
キーストアのパスワードを入力してください:
別名: androiddebugkey
作成日: 2014/12/02
エントリタイプ: PrivateKeyEntry
証明連鎖の長さ: 1
証明書[1]:
所有者: CN=Android Debug, O=Android, C=US
発行者: CN=Android Debug, O=Android, C=US
シリアル番号: 547ceee6
有効期間の開始日: Tue Dec 02 07:42:46 JST 2014 終了日: Sat Apr 19 07:42:46 JST 2042
証明書のフィンガープリント:
MD5: F4:DD:E2:C2:24:5F:47:4B:58:E5:60:2D:90:AD:05:A6
SHA1: 2D:A6:C0:8B:EB:B6:32:97:9E:B1:7C:7D:31:C7:7A:6E:D2:AA:73:87
署名アルゴリズム名: SHA1withRSA
バージョン: 3

Step6 クライアントID作成

  1. Developer ConsoleからクライアントIDを作成します。f:id:mondayboy:20141203063809p:plain
  2. 「インストールされているアプリケーション」を選択し、「同意画面設定」ボタンを押します。f:id:mondayboy:20141203063810p:plain
  3. 必要な情報を入力し、「作成」ボタンを押します。f:id:mondayboy:20141203063811p:plainf:id:mondayboy:20141203063812p:plainf:id:mondayboy:20141203063813p:plain

Step7 サンプルプログラム

まずは勉強がてらにandroid-fitサンプルプログラムをインポートします。

  1. App compat library v7*3をプロジェクトのライブラリとしてインポートします。*4f:id:mondayboy:20141208014028p:plain
  2. Google Play Service libraryをプロジェクトとしてインポートします。f:id:mondayboy:20141208014719p:plain
  3. android-fitのサンプルプログラムをインポートし、プロジェクトのライブラリを追加します。f:id:mondayboy:20141208015146p:plain

以上でサンプルプログラムが動作するところまで来ました。ここまでくるのに結構四苦八苦してしまったわ〜。
あとはコードを見て勉強しようかなと思います。

*1:表示文字が文字化けする場合は、ターミナルの文字コードをShift-JISに設定します。

*2:SH1のハッシュ値

*3:android3.xから対応されたactionBarを2.x系でも対応するライブラリ

*4:リソースファイルが見つからない旨のエラーが発生したのでproject.propertiesファイルのtargetをandroid-21に変更

GRunner

GRunnerを作成してからだいぶ年月が経ちますが、サイトに掲載してもられると
やっぱり嬉しいです。Applivさん、ありがとうございます。


GRunner (日本語版)のアプリ情報 | Androidアプリ -Appliv

iPhoneアプリ発見サイト -Appliv

最近はウェラブルが流行っているので、
今度はそっち系に挑戦してみるかな〜