RSS

Arduino-雜記/USB shield使用滑鼠/Flora+Neopixel+光纖導光條/16-channel servo shield/發熱墊

常覺得玩Arduino很容易受限於周邊的感測器,所以就記錄一些還不錯用又少見中文介紹的商品
可以上IC shopping找

一.USB shield操控滑鼠:
當初在找如何在Arduino上使用滑鼠相關資訊卻意外的難找,連英文資料都十分少(是我的search有問題嗎~”~
最後自己買了一塊Sparkfun 的USB shield
下載他們的Library:https://github.com/felis/USB_Host_Shield/blob/master/examples/a
 滑鼠的範例是在HID資料夾中,但是燒錄後發現不能使用
後來找了資料結果是 USB shield需要將Pin7連接到Reset,接上去後就成功了~
https://www.sparkfun.com/products/9947
p3

另外pin9 pin10也可以透過修改硬體與Lirary切換腳位,畢竟UNO上9,10都是支援pwm
資料:https://www.circuitsathome.com/usb-host-shield-hardware-manual
修改Library很簡單就不提了,硬體部份圖示:
沿著pin9觀察電路,切斷正面的那一條,翻到背面正面那一點有連到另一點,點上有些許焊錫,用電線連結不要的腳位即可https://github.com/sj82516/meArm_USB
p19p17 p18

二.Flora+Neopixel+光纖導光條
之前想要玩電子編織所以買了Flora,才發現電子編織難度有點高阿(淚~
原本測試成功動一動疑似接觸不良就GG了,有上了導電漆一樣不行
後來就只好放棄……
不過Flora是我目前最喜愛的板子,外觀精巧僅有巴掌一半大
而且可以用鱷魚夾做快速測試,pin腳有I2C、SPI還有四隻A/D皆可的pin腳
p1

不過卻也發現了Neopixel意外的好用,這是Adafruit出的三色LED
但是只要用一個pin腳操控,而且可以串連多個
官方資料說可以串十來個都不是問題,一個pin腳能夠做出如此多變化真的很方便~
而且UNO版用一般腳位也可以使用喔,超級方便的~
唯一缺點是明暗效果也做不出來
http://www.adafruit.com/products/1559

光纖導光條則是拿來配合燈光輸出效果,價格頗貴30cm $100NT
效果有點像是壓克力的加強版,這是作品的半成品
11850774_1108864842460355_895029149_n

三.16-channel servo shield
Arduino UNO只有四個pwm pin腳,如果要操控多個伺服馬達可就頭痛了
好在Adafruit有出擴充版,最多可以控制16顆伺服馬達(y)
不過官方給的Library裡頭是用pulse(秒數)來控制伺服馬達,想要用0~180 degree方式控制就要用map()作轉換
每顆伺服馬達訊號供電時間與角度對應似乎不盡相同,所以都要多作嘗試
https://www.adafruit.com/products/815

四.加熱墊
如果希望做出一些”溫暖”的作品可以考慮這塊發熱墊,最高溫只有60度
人體感溫不會太刺激,我直接用手摸就覺得熱熱的頗舒服,用布隔著相信效果很不錯
5V供電不過要吃600mA,也就是3W功率,使用電池的話會一下就沒電了
另外如果要使用電晶體操控開關也要注意 一般的2N3906這類是不能用的,因為最大功率與電流都不夠
所以要另外找大功率的電晶體,搜尋一會發現 TIP120似乎還不錯
p5
https://www.sparkfun.com/products/11288

 
Leave a comment

Posted by on August 11, 2015 in Uncategorized

 

Android – FB SDK雜記

運用Facebook的Graph api取得資訊
因為我有時做一個給使用者留言的List
所以希望可以將每個使用者的FB id存在databse中,接著將每個使用者的name還有image都讀取出來
以下是我實作利用user id讀取user name的方式
GraphRequest是Facebook函式庫裡頭extend Object的函式(官方文件

GraphRequest request = GraphRequest.newMeRequest(
   AccessToken.getCurrentAccessToken(),
   new GraphRequest.GraphJSONObjectCallback() {
      @Override
      public void onCompleted(
         JSONObject object,
         GraphResponse response) {
         try {
            Log.d("Name",object.getString("name"));
         }catch (JSONException e){
            Log.d("Error",e.toString());
         }
      }
   });
Bundle parameters = new Bundle();
parameters.putString("fields", "id,name,link");
request.setParameters(parameters);
request.executeAsync();

[延伸一]:可以直接設定URL,用以往Request方式來讀取資料
URL = “https://graph.facebook.com/id=?”+ userid +”&access_token=”+ AccessToken.getCurrentAccessToken().getToken()
只是還需要自己完成整個GET request的方式(使用Volley或是HttpRequest這類的)
相對來說麻煩了些
[延伸二]:使用FB graph api explore可以幫助測試:https://developers.facebook.com/tools/explorer

有趣的是取得FB使用者的大頭照是不需要AccessToken的
可以用一般的URL直接讀取
這部分我就另外用Volley做處理

另外,因為測試的留言變多了
所以我實作了動態載入Listview,其實也蠻簡單的
就只是宣告 當ListView被滑動時檢查動態,如果目前螢幕上顯示的第一行List加上螢幕呈現的總List數為全部List數
(OS:就是拉到底的意思了~)
此時就做動態載入的動作
這邊有個小Bug,因為Volley是另外開Thread跑,而執行當中UI Thread仍然值續執行
所以我之前測試時不斷的載入舊資料OTZ
最後解決辦法就是宣告一個全域變數儲存應該要載入的List編號
有執行這種Multi-Thread情況時要特別注意與UI間的配合

listView.setOnScrollListener(new AbsListView.OnScrollListener() {
    @Override
       public void onScrollStateChanged(AbsListView view, int scrollState) {
         }

    @Override
       public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
         if((firstVisibleItem + visibleItemCount) ==  totalItemCount){
            Log.d("Onscroll",Integer.toString(firstVisibleItem)+":"+Integer.toString(visibleItemCount));
           listcount += 5;
           callWeatherComment(listcount);
         }
      }
});

研究Volley的lrucache,lrucache是Android 設置的內存
減少反覆發送Request的麻煩
一直在研究始終搞不太懂
後來發現說,當使用volley的imageloader時,此時會需要實作bitmapcache的部分(設置cache大小)
之後將bitmapcache引入imageloader後,volley會自動執行cache這部分的操作(使用的是level2 Cache)
參考資料:http://blog.csdn.net/guolin_blog/article/details/17482165

使用FB user id 讀取姓名與大頭貼照片,以下這段是實作在ListAdapter當中
另外FB有提供 NetworkImageView,有興趣可以查查

紀錄這麼雜亂也不知道有沒有人看得懂(或是有沒有人要看?XD
FB SDK頻頻更新,目前到了第四版,網路資料許多都十分舊,大多數又是英文
所以自己多次Try and error後決定記錄下來,希望對大家有些幫助
完整程式碼:https://github.com/sj82516/Weatherer

//String uid = cmt.getName();
        String uid = cmt.getName();

        //get facebook name
        GraphRequest request = GraphRequest.newMeRequest(
                AccessToken.getCurrentAccessToken(),
                new GraphRequest.GraphJSONObjectCallback() {
                    @Override
                    public  void onCompleted(
                            JSONObject object,
                            GraphResponse response){
                        if(object!=null) {
                            try {
                                txt_name.setText(object.getString("name"));
                            } catch (JSONException e) {
                                txt_name.setText("android");
                            }
                        }else{
                            txt_name.setText("android");
                        }
                    }
                }
        );
        Bundle parameters = new Bundle();
        parameters.putString("id",uid);
        request.setParameters(parameters);
        request.executeAsync();

        //load facebook account icon
        ImageLoader imageLoader = AppController.getInstance().getImageLoader();
        String img_value ="http://graph.facebook.com/"+uid+"/picture?type=large";
        img_icon.setImageUrl(img_value, imageLoader);
 
Leave a comment

Posted by on August 9, 2015 in Uncategorized

 

Processing-研讀Java

最近在開發Processing,使用Java上發現自己對於OOP的概念實在是不夠扎實 在使用unfolding函式庫時發現

Marker marker = map.getFirstHitMarker(mouseX, mouseY);
if (marker != null) {
println(marker.getLocation().toString());
println(marker.getProperty("tot").toString());
marker.setSelected(true);
}

Marker是一個interface,而在map中有儲存implement Marker的class
但是map.getFirstHitMarker回傳值也是Interface
此時我就覺得納悶 為何抽象類別的Marker可以使用自己內建的函式呢?
後來直接寄信去問XD 結果unfolding團隊的工程師很快速就回我信了(y)
他解釋說 interface會自動轉成implementation class,這因為有許多Class都implement Marker這個interface
所以這邊宣告成Interface,不管使用者選用哪個子類別都可以正常運作 https://github.com/JustinSDK/JavaSE6Tutorial/blob/master/docs/CH01.md#11%E4%BB%80%E9%BA%BC%E6%98%AF-java

系列文:抓取Youbike公開資料
https://github.com/sj82516/Processing_JSON_Youbike_Info-map
持續更新中~

 
Leave a comment

Posted by on July 26, 2015 in Uncategorized

 

Android-FaceBook api開發筆記

離開學校後,搬來台北實習 遠離大學四年熟悉的人事物,突然搬到一個陌生的環境 心情的調適上真的需要一段時間啊 Anyway,趁著好天氣,開始繼續Android的開發之路囉 這兩天在弄Facebook登入功能,順便筆記一下 詳細的教學影片 照著做基本上就弄完了 只是在開發上遇到很多問題…. 首先是emulator,Facebook官網的guideline說要先在emulator上安裝Facebook https://developers.facebook.com/quickstarts/1595171790768928/?platform=android FB有提供apk檔下載,可是安裝上遇到重重的問題(怒 首先是emulator的環境,一般來說電腦都是x86架構,但是手機是arm架構 所以要在emulator上安裝apk就需要是arm背景的(如圖 fbfb2
這部分我就弄超級久的==“
因為一般來說我都是用x86-64的emulator,因為可以用加速器,跑起來很快
我之前遇到的問題有: Failure [INSTALL_FAILED_NO_MATCHING_ABIS]->
這其實就是說系統架構錯誤
有一次安裝成功後,進入emulator點FB就閃退
如果有遇到這兩個問題,那就先檢查你的emulator系統架構囉~(參考資料

不過改用arm架構的emulator後,光是FB setting就跑十來分鐘…… 超級慢的~
記得要先確認FB再emulator中可以跑喔
Failure [INSTALL_FAILED_INVALID_URI]
有時候會遇到這個問題,這似乎是權限問題 可以參照Stackoverflow上的解法
進入dab shell後修改chmod 777 data/local

另外一個比較麻煩的是adb指令部分
我是用Mac,一開始打開Terminal後,路徑初始處打”ls”,可以看到”Library”資料夾
進去後”Android” -> “sdk” -> “platform-tools” 就可以看到”adb”存在
這時候才能使用./adb指令
接著是跟著FB官網提供的文件做:
1.首先要到FB developer中註冊,並且申請專屬的APP,影片有教學
2.Get Start 主要是Android上的一些設定,不過在Key Hash這邊我有遇到一些問題
手動產生的Key Hash我不知道該怎麼該Android App做連結,所以採用立一個做法
在Application中print key hash,再加入FB developer的設定中,影片也有提到
*原來在輸入金鑰那邊要打入 android才是正確的(汗~
3.接著是Login官方教學 我後來是直接下載影片的範例code測試,記得要修改App ID還有將Key hash加入你的FB app中 這樣就成功囉~ 接著是Android的程式碼部分:

首先,FB是用自己專屬的Graph API(中文教學) 資料有分權限,所以有必要的話需跟使用者索取權限
拿到權限AccessToken就可以做事囉~
在實作login上有幾個要注意的class,LoginButton、LoginManager、CallbackManager、AccessToken、Profile
LoginButton顧名思義就是FB sdk的UI元件,當然也可以自己客製化 LoginButton要負責定義setReadPermission(需要多少權限),setFragment(如果在Fragmet裏頭用的話) 還有registerCallback(成功,失敗、取消的對應處理)
LoginManager則是在non-UI的情況下使用
CallbackManager可以注意到,FB登入是呼叫手機中的FB App然後回傳結果,所以就必須使用CallbackManager去接結果 同時必須要override onActivityResult(…)
AccessTokenTracker就是用拿追蹤AccessToken的囉,可以改寫用來判斷使用者是否登入過等等
ProfileTracker追蹤profile,profile就是取得該權限的資料囉,接著使用profile.getName()或是其他get__()就可以讀取特定值 十分的方便啊~ 剩下的瑣碎就看官方文件囉~

 
Leave a comment

Posted by on July 5, 2015 in Uncategorized

 

Web Server+Android 開發筆記三

1.去掉上排的title bar,可能是因為我有使用support library,
我在onCreate()最前面放
super.onCreate(savedInstanceState);
getSupportActionBar().hide(); //隱藏
setContentView(R.layout.activity_main);
其他常見的用法版本就都失效囉~
http://stackoverflow.com/questions/28290956/how-to-remove-activity-title-in-android-studio

2.使用Volley傳送Post jsonrequest,如果是要傳字串,務必要加”,又被這鳥鳥的Bug卡好久QQ

JSONObject js = new JSONObject();
        try {
            js.put("temp",score.getScr_temp()); //int
            js.put("hmd",score.getScr_hmd());
            js.put("spd",score.getScr_spd());
            js.put("rain",score.getScr_rain());
            js.put("cmt","'send from android'"); // 注意單引號!!
            js.put("name","'hello'"); // 注意單引號!!
        }catch (JSONException e) {
            e.printStackTrace();
        }
        String url="yourserver";
        JsonObjectRequest req = new JsonObjectRequest(Request.Method.POST,url, js,
                new Response.Listener() {
                    @Override
                    public void onResponse(JSONObject response) {
                        try {
                            Log.v("Response:%n %s", response.toString(4));
                        } catch (JSONException e) {
                            Log.e("Err:",e.toString());
                        }
                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Log.e("Error: ", error.getMessage());
            }
        }) {
            @Override
            public Map getHeaders() throws AuthFailureError {
                HashMap headers = new HashMap();
                headers.put("Content-Type", "application/json; charset=utf-8");
                return headers;
            }
        };
        AppController.getInstance().addToRequestQueue(req);

3.abstract使用
http://www.mobile01.com/topicdetail.php?f=512&t=2971459
http://jimmu-jimmu.blogspot.tw/2012/10/abstract-classinterface.html

4.px/dp/sp 好難懂啊~
http://stackoverflow.com/questions/2025282/difference-between-px-dp-dip-and-sp-in-android

 
Leave a comment

Posted by on June 22, 2015 in Uncategorized

 

-Web Server+android 開發筆記二

1.今天想在apache上放兩個Server,檔案都設定好卻沒辦法執行,原來是忘記修改ports.conf
http://blog.bobchao.net/2007/02/apache2-port.html

2.使用commit()的時機,每行SQL comment後都要commit嗎? 這篇給了一個還不錯的解釋
http://stackoverflow.com/questions/13287749/should-i-commit-after-a-single-select

3.今天想要實作讀取天氣資訊的Server,資料來源從weather.com api 我是用城市名直接讀取資料
另外會使用datetime抓系統時間是因為weather.com資料每三小時才更新一次,同樣的我希望每三小時更新一次資訊就好
同樣的因為是免費讀取的關係,weather.com有限制存取次數

@app.route('/weather_cdt/', methods=['GET'])
def weather_cdt(city):
    try:
        c,conn = connection()
        c.execute("SELECT time from weather_cdt where location='Taipei'")
        temp = datetime.now()+timedelta(hours=-2)
        currtime = temp.strftime("%Y%m%d%H")
        timestamp = c.fetchone()[0]
        if (timestamp==0) or (currtime > timestamp):
            for row in cities:
                url = "http://api.openweathermap.org/data/2.5/weather?q="+str(row)
                response = urllib2.urlopen(url)
                data = json.load(response)
                conn.commit()
            temp = datetime.now()
            currtime = temp.strftime("%Y%m%d%H")
            c.execute("update weather_cdt set time=%s where location='Taipei'",currtime)
            conn.commit()
        c.execute("select temp from weather_cdt where location=%s",city)
        temp = c.fetchone()[0]
        d = {"temp":str(temp)}
        json_temp = json.dumps(d)
        return json_temp
     except Exception as e:
        return str(e)

4.要再Mysql table name用parameter的話
http://stackoverflow.com/questions/15255694/python-mysqldb-execute-table-variable

sql = "SELECT * FROM %s" % table
cursor.execute(sql)

5.Android:ImageButton的圖片要用src設定,這樣scaleType設定才有用,background可以接另外的xml做變化

*6.在Android如需使用Http request需要在non-UI thread執行,常見的方法就是用Asynctask
http://stackoverflow.com/questions/3505930/make-an-http-request-with-android
http://blog.csdn.net/guolin_blog/article/details/12452307

#7.更新:官方表示 如需使用Http request不要再用HttpClient還有AsynTask,要改使用Volley函式庫
官方表示前者有需多bug而且效率低迷,改使用後者的函式庫會比較好
而且volley支援RESTful API,在接發Request可以直接用JSON,比原本的方便很多~
http://code.tutsplus.com/tutorials/an-introduction-to-volley–cms-23800
有兩種安裝方式:
一.
1.下載檔案 git clone https://android.googlesource.com/platform/frameworks/volley
2.在原專案中按 import module->選擇下載完成的volley資料夾
3.在grandle加入 compile project(‘:volley’) //此為註解*(‘:module_name’)
重新專案同步後就可以使用了
二.在grandle檔案加入:
compile ‘com.mcxiaoke.volley:library:1.0.+’

8.ArrayAdapter與BaseAdapter的差別
http://stackoverflow.com/questions/16796182/difference-between-usage-of-baseadapter-and-arrayadapter

9.使用Custom Listview and array adapter,要記得將listView.setAdapter(adapter);放在item.add(Obj)之後
不然會一片空白………… 被這個蠢Bug卡了半小時OTZ

10.如果要加字體,要在src->main底下自創assets/fonts資料夾,接著把字體放進去
使用方式:http://code.tutsplus.com/tutorials/customize-android-fonts–mobile-1601

 
Leave a comment

Posted by on June 18, 2015 in Uncategorized

 

托福準備心得

托福成績終於出來了
準備兩個月,沒有補習,總分94,分數都蠻平均的
雖然跟網路上動則破百的神人相比十分的廢Q_Q
不過對於我來說成績還算夠用了

準備部分我都主攻聽讀
網站是用這個免費TPO線上測驗
這個網站實在是太好用了
全模擬試題,還可以幫你記錄所有的答題紀錄
聽力甚至有全文精聽可以一次次review
我聽讀都沒有準備其他,就不斷地做TPO
成績都是24,覺得有點爛OTZ
當初目標是聽讀至少50+

說寫的部分因為我底子不好
一直拖到最後兩三個禮拜才開始準備
後來發現有模板的幫助實在是太有用了
可以先看過這個好用的 口說準備
這篇部落格詳細的解說口說六題的題型與應對方式,同時提供簡單模板與範例可以學習
寫作部分我是買書看,後來發現整合寫作一點都不難
獨立寫作稍難些,不過還是有跡可循
有點後悔太晚準備了,不過也就勉勉強強了

最後補充考試當天,當天基本上只要帶護照即可
考試考場最好挑過,我去台北的覺得有點小,而且螢幕看得有點不舒服
考試當天有遇到聽力加試,那時候我就有聽到其他人口說的內容~o~
所以我前兩題答得還蠻順的
不過其他的就講得斷斷續續,都還算有講滿時間
最後拿到22,分數沒有想像中的低

 
Leave a comment

Posted by on June 13, 2015 in Uncategorized