RoBoard魔人的機器人日誌

2012/1/24

[NXT系列第三彈] RoBoard控制Ultrasonic Sensor

NXT-Ultrasonic Sensor



終於到了超音波感測器~

線材依然是不多說囉~

不過這一次不需要用到AD   也就是   分岔的白線不需要用到

因為超音波是用I2C

在蠻久之前有講過I2C    就是G146以及wii搖桿的時候

所以相信大家都蠻熟析這介面的





先來看看怎麼接吧!

白 ───VCC(9V)
黑 ──────GND
紅 ──────GND
綠 ──────VCC(5V)
黃 ──────SCL
藍 ──────SDA


注意白線是給9V
紅線是給5V




本魔在此是使用110
所以我servo power直接給9V的電   PWM輸出就是9V了!
用的是100   你也可以直接把電源給9V    或另外接外部電源
至於Ultrasonic sensor的位址以及命令為何呢?


addr : 0x02>>1
cmd : 0x42






這樣基本上就可以去讀取sensor回傳的值囉!


範例影片:






範例code:
#include "stdio.h"
#define USE_COMMON
#include "common.h"
#include "conio.h"
#include "roboard.h"
int main(){
 roboio_SetRBVer(RB_110);
 int val = 0;
 i2c_InitSW(I2CSW_LEGO,100);
 unsigned char data[1] = {0};
 while(!kbhit()){
  i2c_SensorRead(0x02>>1,0x42,data,1);
  delay_ms(100);
  printf("%3d\r",data[0]);
 }
 i2c_Close();
 return 0;
}
Share:

2012/1/19

[NXT系列第二彈] RoBoard控制Light Sensor

NXT-Light Sensor



上次已經介紹過了線材

所以這次就不多說了

Light Sensor要用到的線有5條

白,黑,紅,綠,黃


白 ─┬─●──VCC(5V)
        └────AD
黑 ──────GND
紅 ──────AD-GND
綠 ──────VCC(5V)
黃 ──────GPIO(3.3V)


附註: ●代表10歐姆電阻

黃線的GPIO其實是控制紅色LED亮暗用的

在範例程式中沒有用到GPIO  是因為本魔直接使用I2C的3.3V

這樣LED就會一直亮著(有點偷吃步啦)






Light Sensor的原理其實是由一個LED燈  與一個光明感測器做成的

平常是拿來走軌跡用的

因為黑色會吸光   白色會反光     所以LED照下去後   讀取到的值會有差

而我影片中用的...   並不是專門用的..    所以反光效果較不穩定


範例影片:



範例code:
#include "stdio.h"
#include "conio.h"
#include "roboard.h"
int main(){
 roboio_SetRBVer(RB_110);
 int val = 0;
 bool setDo = false;
 spi_Init(SPICLK_21400KHZ);
 while(!kbhit()){
  val = adc_ReadCH(0);
  if(val < 500 && !setDo){
   setDo = true;   
   system("CLS");
   printf("LIGHT\n");
  }else if(val >= 500 && setDo){
   setDo = false;   
   system("CLS");
   printf("DARK\n");
  }
 spi_Close();
 return 0;
}
Share:

2012/1/16

[NXT系列第一彈] RoBoard控制Touch Sensor

NXT-Touch Sensor


首先來介紹下NXT的線

NXT-線材

看起來很像電話線(題外話)


好    拿起線材看一下他裡面的顏色吧!
NXT的線是固定的顏色
由右至左看的話
白 , 黑 , 紅 , 綠 , 黃 , 藍

每條線都對不同的Sensor都有不同的意義
所以千萬別亂接

為了要接到RoBoard上
可能需要買轉接頭   (如果要直接剪線直接做也是可以)

需要注意的一點是
白線要特別做一個10歐姆的電阻然後要並聯接起來(圖上是9+1)


一切準備就緒後
將Sensor接上RB吧!

首先
將白線10歐姆那條   接到VCC(5V)
白線 無電阻的那條接到  AD
黑線   接到GND
紅線   接到AD的GND
這是標準的接法    (讓兩條共地)

小提醒: 要先接地再接電比較安全喔

注意別接錯了   Sensor燒壞...  不負責...


程式部份
基本上  他只是讀取AD值   
未按下時通常為5V(值1023左右)      
被按下時會變到0.93V(值190左右)


範例影片:





範例code:
#include "stdio.h"
#include "conio.h"
#include "roboard.h"
int main(){
 roboio_SetRBVer(RB_110);
 int val = 0;
 bool setDo = false;
 spi_Init(SPICLK_21400KHZ);
 while(!kbhit()){
  val= adc_ReadCH(0);
  if(val == ADC_READFAIL){
   printf("error\n");
   break;
  }else{
   if(val < 512 && !setDo){
    setDo = true;   
    system("CLS");
    printf("PRESS\n");
   }else if(val >= 512 && setDo){
    setDo = false;   
    system("CLS");
    printf("RELEASE\n");
   }
  }
 }
 spi_Close();
 return 0;
}
Share:

2012/1/9

[開箱文] RB總部搶先看


1/30更新:

機器人足球場蓋好啦~~~ 三個小球場一個大球場
之前就說過這空間可以讓機器人追趕跑跳碰吧~

擺設機器人中...不然只拍場地頗單調

這場地真的還不小
以機器人的比例來看應該跟真的球場一樣大吧?

很大吧!!!??   本魔都變那麼小了!!!


1/18更新:
窗外的耶穌光


捷運站   跟上一次看起來真的差蠻多的


風景宜人~


有點散掉了   可惜


夕陽無限好阿~



捷運站   拉近版


右上角那看起來像天使??   (好像有些牽強)


透出一道道的耶穌光~


真期待捷運快蓋好   蓋好就可以拍到捷運了XD...






DM&P 瞻營全總部已經換地方囉!!



本魔在此推出RB總部的開箱文!!



 5星級的廁所!?





總部外空間真的很大!
都可以給機器人追趕跑跳碰了?





總部的辦公室內部
旁邊一排書架!

又一排書架!
一共3排
呈現一個ㄇ字型


.屋頂
太陽能板~!!
完全是綠建築阿!!


側面

近捷運
據說走路3分鐘可以到


風景宜人
好像說有耶穌光
可惜天氣不好

後面可以看到觀音山 


RB魔人的座位
目前東西都還在家中...
不過真的...很大!?


RB團隊(小部分)
Share:

2012/1/1

[練習] adjacency multilist

由於某天學到了這個圖形表示法

本魔就開始覺得這表示法怪怪的

問了RoBoard Lab後 我們找到了一篇N年前的論文

他主要是比較各種圖形表示法的優缺點


可以看得出來是用打字機打的...
他用的語言是Pascal
有興趣的人可以自己研究看看


然後我稍微介紹一下這種圖形表示法

他是用一個結構來做的

那結構有 mark,value1,value2,link1,link2

每個link代表本點接到的下一條線

舉例:  (網路搜尋到相關文章 都會找到一樣的範例)


mark是用來偵測是否把後面兩個link填完用的

填完後其實沒有什麼用處

畫掉的地方代表NULL 表示為沒有其他線了





然後我自己又想出了另一種方法來做adjacency multilist

我是用遞迴一層一層丟

遇到該新增的就新增

遇到該搜尋的就搜尋

然後將自己的address回傳

這樣就會自己填完這表格

也不需要特別去做mark的空間

以下為code:

#include <stdio.h>
#define graph_Max 4
struct Multilist{
 int val1;
 int val2;
 struct Multilist *link1;
 struct Multilist *link2;
};
Multilist **Matrix_to_Multilist(bool [][graph_Max]);
Multilist *Multilist_recursion(bool [][graph_Max],Multilist *[graph_Max],int,int);
int main(){
 //-------------graph-------------//
 /*
     ┌─0─┐
     │ │ │
     1─┼─2
     │ │ │
     └─3─┘
 */
 //-------------------------------//
 bool graph[graph_Max][graph_Max] = {
           {0,1,1,1},
           {1,0,1,1},
           {1,1,0,1},
           {1,1,1,0}};
 Multilist **list;
 list = Matrix_to_Multilist(graph);
 getchar();
 return 0;
}
Multilist **Matrix_to_Multilist(bool graph[][graph_Max]){
 Multilist *start[graph_Max];
 for(int i = 0; i < graph_Max; i++){
  start[i] = Multilist_recursion(graph,start,i,0);
  //-------------output steps-------------//
  Multilist *t = start[i];
  bool out = false;
  printf("start[%d] --> %X\n",i,t);
  while(!out){
   printf("%X:\t%d,%d,%X,%X\n",t,t->val1,t->val2,t->link1,t->link2);
   t = t->val1 == i ? t->link1 : t->link2;
   if(t == NULL)
    out = true;
  }
  printf("\n");
  //-------------output steps-------------//
 }
 return start;
}
Multilist *Multilist_recursion(bool graph[][graph_Max],Multilist *start[graph_Max],int x,int y)
{
 if(y >= graph_Max)  //If search out of the graph, then return NULL, means it's end.
  return NULL;
 if(!graph[x][y])  //If two point are not linked, then skip this step.
  return Multilist_recursion(graph,start,x,y+1);
 Multilist *t;  //Use on add a Mutilist or get next Mutilist. 
 if(x < y){  //If x < y, means we need to add a Multilist.
  t = new Multilist();
  t->val1 = x;
  t->val2 = y;
  t->link1 = Multilist_recursion(graph,start,x,y+1);  //let the Multilist link to next list.
  return t;
 }else if(x > y){  //If x > y, means we had a Multilist before.
  t = start[y];
  while(t->val2 != x)  //Loop until we find the Multilist which we need.
   t = t->val1 == y ? t->link1 : t->link2;  //Find next list.
  t -> link2 = Multilist_recursion(graph,start,x,y+1);  //let the Multilist link to next list.
  return t;
 }
}
Share:
技術提供:Blogger.

追蹤者