Search

顯示具有 LDS 標籤的文章。 顯示所有文章
顯示具有 LDS 標籤的文章。 顯示所有文章

2015年10月5日 星期一

換MBPR喇叭

    最近喇叭破音超誇張開音樂時整個機器會震動,試了一下發現喇叭壞了去對岸買了一個來換,換的時候又發現喇叭有三根螺絲,其中一根居然滑牙...?!最後只好把壞掉的喇叭用剪線鉗破壞然後再把螺絲用手轉下來...







2015年9月21日 星期一

中秋節放煙火 XD

    去年中秋節做的東西,用的是Kanthal 鎳鉻合金線,加熱速度要看Datasheet的長度電阻和電流量,短短的不到0.5sec通9v就能加熱到發紅點燃煙火引線了XD,記得把加熱合金線的電源和MCU分開XD



data :

2013年9月29日 星期日

ATmega328P-AU With UNO Bootloader

    最近想到拿ATmega328P-AU寫入Arduino UNO Bootloader來快速做個樣品給人看,結果今天Layout好了零件焊上完全無法用Arduino ISP的方式寫入Bootloader,一直朝更改Boards.txt與avrdude.conf的方向去走,結果弄了幾個小時想到把當作ISP的Digital 10直接接到ATmega328P-AU的Reset,不是走原本預留給Upload程式用的Auto Reset線路上有個104P電容,就可以寫入Bootloader了,不知道為什麼Digital 10多走一個104P電容就沒辦法,總之ATmega328P-AU寫入Arduino UNO Bootloader跟ATmega328P-PU一樣,接下來可以改作STM32F1的cost down版本。




=============2014/01/06===============


    如果發現Upload程式失敗可能是Upload的過程中被原先的程式佔用(?),可以Reset或者改接3.3v供電再試幾次就可以了。




=============2016/07/19===============
若在燒錄bootloader時發生錯誤可以在ArduinoISP board上的RESET與GND並聯一個10uF的電容。

2013年9月26日 星期四

三個月的近況...

  話說Blog荒廢三個月以上幾乎快忘記這邊的存在了,現在除了忙案子和開發公司的產品之外還有研究所要準備,以及大大小小的比賽和畢業專題...還是記錄一下這三個月在幹嘛好了

  大約在去年十二月左右強者我班上同學就想拉我去他開的公司(Doit 杜瓦行銷有限公司),不過一開始我因為案子很多還有我對當時想產品實在沒有興趣,所以我只有說等到有我有興趣的東西再去幫忙,五月左右聽到一個不錯的想法後就答應七月中處理完日檢還有帶女友回高雄老家玩後,就去桃園中壢公司住到開學全力開發產品雛形跟腦力激盪新產品,這兩個月都在弄指紋機、RFID和各種影像處理程式和奇怪的程式與公司內的Hackday XD。



  這兩個月其實很好玩,我覺得中壢生活比想像中的好,在我心中大約高雄 > 中壢 > 台中這樣吧,基本上能吃的都吃過了該去看的也都有,而且不知道為什麼總覺得中壢生態很好半夜都能聽到公司外的蟲叫,總之現在我們只是四人的新創公司,正在全力研發我們的新產品,因為人少的原因常常得一人Cover很多技術或公司內部等等的東西。



  開學到現在也要兩週了,都在忙比賽的文件和研究所甄試資料,這學期光比賽就被叫去參加四個以上,還有研究所推甄文件也要在十月五號前生出來才保險,畢業專題就等老師要看什麼就給什麼就好XD總之這學期真的很忙,還有女友、案子等等的事情...,雙手抓住太多東西真的怕什麼都會弄不好...XDZ

2013年2月17日 星期日

鑭玻璃去衰退黃化




  最近試著用人家說的紫外線去除法用了幾天(都照射24H)有效果出來,找到的紫外線LED是405nm吃3.4v/20mA,所以用充電電池四顆充飽約5.2V,5.2V - 3.4V = 1.8V => 1.8V / 20mA = 90R => 所以每個燈串個90R電阻就好,話說我覺得從鏡尾照比較有用?

day 0


day 1


day 2


day 3




day4


2013年1月29日 星期二

Electronic Candle

  剛剛看我妹清出一個電子蠟燭XD,用一個電容式麥克風和一個RGB色LED以及一個被封住不知名的MCU(比ATtiny85還小的感覺),不過可惜的是麥克風只有開關的功能,如果顏色會隨麥克風受力大小改變會有真實蠟燭的感覺XD(這個顏色變化是固定隨機XD)。





2013年1月24日 星期四

PID Controller

  去年暑假無意間看到有paper用基因演算法去自動調整PID控制參數,感覺上非常實用也很有趣不過工作很忙一直沒時間研究,這幾天又想趁有空閒來實現那個paper,又突然看到Arduino PID Library的作者的Blog解說,發現跟一般普通理想化的PID公式不同,因此讀完了以下參考前八篇(Arduino PID Library)以及第九篇(補充說明),跟著每一篇實作code與推導公式收益良多!

PID.h


#ifndef __PID__
#define __PID__

const bool DIRECT = true;
const bool REVERSE = false;

const bool ON = true;
const bool OFF = false;

class PID
{
   public:
      PID(double*,double*,double*,double,double,double,unsigned long,bool,double,double,double);
      void Computing();
      void SetTunings(double,double,double);
      void SetSampleTime(unsigned long);
      void SetOutputLimits(double,double);
      void SetOnOff(bool);
      void SetDirection(bool);

   private:
      double Kp,Ki,Kd;
      double *input,*output;
      double *setpoint;

      double integral;
      double last_input;

      double min,max;

      unsigned long last_time;
      unsigned long sample_time;

      bool on_off;
      bool direction;
};

#endif


PID.cpp


#if ARDUINO >= 100
#include <Arduino.h>
#else
#include <WProgram.h>
#endif

#include "PID.h"

PID::PID(double *_input,double *_output,double *_setpoint,
      double _Kp,double _Ki,double _Kd,
      unsigned long _sample_time = 100000,
      bool _on_off = OFF,double _direction = DIRECT,
      double _min = 0,double _max = 255)
{
   input = _input;
   output = _output;
   setpoint = _setpoint;

   sample_time = _sample_time;

   on_off = _on_off;

   SetOutputLimits(_min,_max);

   SetDirection(_direction);

   SetTunings(_Kp,_Ki,_Kd);

   last_time = (micros() - sample_time);
}

void PID::Computing()
{
   if(on_off == OFF){
      return ;
   }

   unsigned long now = micros();

   if((now - last_time) >= sample_time){
      double error = (*setpoint - *input);

      integral += (Ki * error);
      if(integral > max){
integral = max;
      }
      else if(integral < min){
integral = min;
      }

      double diff_input = (*input - last_input);

      *output = (Kp * error) + integral - (Kd * diff_input);

      if(*output > max){
*output = max;
      }
      else if(*output < min){
*output = min;
      }

      last_input = *input;
      last_time = now;
   }
}

void PID::SetTunings(double _Kp,double _Ki,double _Kd)
{
   if((_Kp < 0) || (_Ki < 0) || (_Kd < 0)){
      return ;
   }

   double SampleTimeInSec = ((double)sample_time) / 1000000.0f;

   Kp = _Kp;
   Ki = _Ki * SampleTimeInSec;
   Kd = _Kd / SampleTimeInSec;

   if(direction != REVERSE){
      Kp = (0 - Kp);
      Ki = (0 - Ki);
      Kd = (0 - Kd);
   }
}

void PID::SetSampleTime(unsigned long _sample_time)
{
   if(_sample_time > 0){
      double ratio = ((double)_sample_time / (double)sample_time);

      Ki *= ratio;
      Kd /= ratio;

      sample_time = _sample_time;
   }
}

void PID::SetOutputLimits(double _min,double _max)
{
   if(_min > _max){
      return ;
   }

   min = _min;
   max = _max;

   if(on_off == ON){
      if(*output > max){
*output = max;
      }
      else if(*output < min){
*output = min;
      }

      if(integral > max){
integral = max;
      }
      else if(integral < min){
integral = min;
      }
   }
}

void PID::SetOnOff(bool _on_off)
{
   bool new_state = (_on_off == ON);

   if(new_state == (!on_off)){
      integral = *output;
      last_input = *input;

      if(integral > max){
integral = max;
      }
      else if(integral < min){
integral = min;
      }
   }

   on_off = new_state;
}

void PID::SetDirection(bool _direction)
{
  if((on_off == ON) && (_direction != direction)){
      Kp = (0 - Kp);
      Ki = (0 - Ki);
      Kd = (0 - Kd);
   }

   direction = _direction;
}




參考:

  第一篇是基本的PID公式,第二篇將採樣時間固定而消去幾次除法運算(Kalman Filter等等的微積分時間也可以這樣簡化計算),第三篇說明如何做Anti-Derivative Kick,第四篇說明如何消去中途修改PID參數的落差,第五篇說明如何做Anti-Reset Windup,第六篇其實就是說中途中止計算要記得直接跳出不要更改狀態,第七篇接續前一篇如果要恢復記得要回到上次計算的狀態,第八篇說明計算結果方向(正負號),例如Input大於Setpoint就增加Output(正向),或者Input小於Setpoint就增加Output(反向),第九篇算是補充說明積分項計算時間點的差異。

  1. Improving the Beginner’s PID – Introduction
  2. Improving the Beginner’s PID – Sample Time
  3. Improving the Beginner’s PID – Derivative Kick
  4. Improving the Beginner’s PID: Tuning Changes
  5. Improving the Beginner’s PID: Reset Windup
  6. Improving the Beginner’s PID: On/Off
  7. Improving the Beginner’s PID: Initialization
  8. Improving the Beginner’s PID: Direction
  9. PID: When Should I Compute the Integral Term?

2012年12月25日 星期二

我現在才知道有CPUID這東西...

    最近想在Library中加入測試SSE指令集支援程度,然後看到這篇有cpuid這指令可用,功能選擇跟中斷很像根據eax決定。

2012年12月2日 星期日

Windows Driver Loader

    這個月有個工作是要用隊友給的driver去對某個設備做I/O操作控制,不過這幾天發現有時DriverMonitor掛驅動有的路徑會有問題,看call CreateService建在 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services的登錄檔ImagePath可能因為編碼問題有點錯誤,也懶得寫INF而且我不太會用工具產生XD,還有個問題我不知道是什麼原因,用看系統service運作的工具理應掛載的測試driver應該不存在了,可是似乎無法重新用DriverMonitor啟動,非得重新開機才可以,前天為了這幾個問題還花幾小時去re DriverMonitor研究幾個function,不過看不出來流程有什麼差異或問題,但還是自己寫了一個常規Loader去處理...話說隊友給的driver還是一直有問題對I/O寫資料給設備有時還是會BSoD.........Orz




2012年11月16日 星期五

Visual CAPTCHA Detection

    幾個禮拜前上課寫個去除背景的demo給人看後沒有在碰了,所以就放上來等哪天想改就有,對於圖形驗證碼感覺上如果背景夠複雜,去除背景的演算法複雜度就很高,至於雜訊一些去除線條的演算法或者濾波可以容易去除常見的雜訊,文字本身扭曲的話可以讓Tesseract之類的OCR Library辨識率降低(即使背景、雜訊完整去除),而一些方法的閾值也是要看情況調整,總結來說個人感覺是背景複雜求平均值不容易,而且可能得將背景分區快去除,但針對設計應該是還是可以去除大部分只是複雜度的問題,但如果文字扭曲變形到一定程度似乎常見OCR Library辨識也不易,所以感覺上文字扭曲是必須的,當然最好還是不要用同系列工具生產的驗證圖片,最好混和多種系列使用,不過沒有試過用ML訓練萬筆樣本測試是否能有效提昇辨識度就是了,這裡這裡有對驗證碼類型的分析。

extractor.h


#ifndef __EXTRACTOR__
#define __EXTRACTOR__

#include<cv.h>
#include<cxcore.h>
#include<highgui.h>

#include <iostream>
#include <map>

class Extractor
{
   public:
      Extractor(char*);
      long Average(); //It depends
      void BackgroundErase(); //It depends
      void ColorFull();
      void NoiseClear(); //It depends
      void Cut();
   private:
      long avg;
      IplImage *image;
};

#endif


extractor.cpp


#include "extractor.h"

Extractor::Extractor(char *name)
{
   image = cvLoadImage(name,1);
}

long Extractor::Average()
{
   cvSmooth(image,image,CV_BLUR);

   avg = 0;

   for(int y = 0;y < 3;++y){
      for(int x = 0;x < 3;++x){
long temp = 0;
temp += image->imageData[y * image->widthStep + (x * 3)] + image->imageData[y * image->widthStep + (x * 3) + 1] + image->imageData[y * image->widthStep + (x * 3) + 2];
avg += temp / 3;
      }
   }


   for(int y = image->height - 1;y > image->height - 4;--y){
      for(int x = 0;x < 3;++x){
long temp = 0;
temp += image->imageData[y * image->widthStep + (x * 3)] + image->imageData[y * image->widthStep + (x * 3) + 1] + image->imageData[y * image->widthStep + (x * 3) + 2];
avg += temp / 3;
      }
   }

   for(int y = 0;y < 3;++y){
      for(int x = image->width - 1;x > image->width - 4;--x){
long temp = 0;
temp += image->imageData[y * image->widthStep + (x * 3)] + image->imageData[y * image->widthStep + (x * 3) + 1] + image->imageData[y * image->widthStep + (x * 3) + 2];
avg += temp / 3;
      }
   }

   for(int y = image->height - 1;y > image->height - 4;--y){
      for(int x = image->width - 1;x > image->width - 4;--x){
long temp = 0;
temp += image->imageData[y * image->widthStep + (x * 3)] + image->imageData[y * image->widthStep + (x * 3) + 1] + image->imageData[y * image->widthStep + (x * 3) + 2];
avg += temp / 3;
      }
   }

   avg /= 36;


   return avg ;
}

void Extractor::BackgroundErase()
{
   long range = 20;

   for(int y = 0;y < image->height;++y){
      for(int x = 0;x < image->widthStep;++x){
long temp = (image->imageData[y * image->widthStep + x] +
      image->imageData[y * image->widthStep + x + 1] +
      image->imageData[y * image->widthStep + x + 2]) / 3;
if(temp  < (avg + range) && temp > (avg - range)){
   image->imageData[y * image->widthStep + x] = image->imageData[y * image->widthStep + x + 1] = image->imageData[y * image->widthStep + x + 2] = 255;
}
      }
   }
}

void Extractor::ColorFull()
{
   for(int y = 0;y < image->height;++y){
      for(int x = 0;x < image->widthStep - 3;x += 3){
long temp = (image->imageData[y * image->widthStep + x] +
      image->imageData[y * image->widthStep + x + 1] +
      image->imageData[y * image->widthStep + x + 2]) / 3;
if(temp > 0){
   image->imageData[y * image->widthStep + x] = image->imageData[y * image->widthStep + x + 1] = image->imageData[y * image->widthStep + x + 2] = 0;
}
      }
   }
}

void Extractor::NoiseClear()
{
   int range = 20;
   IplImage *itemp = cvCreateImage(cvGetSize(image),IPL_DEPTH_8U,3);
   cvCopy(image,itemp);

   for(int y = 0;y < itemp->height;++y){
      for(int x = 0;x < itemp->widthStep - 3;x += 3){
long temp = (itemp->imageData[y * itemp->widthStep + x] +
      itemp->imageData[y * itemp->widthStep + x + 1] +
      itemp->imageData[y * itemp->widthStep + x + 2]) / 3;

long ref =  (itemp->imageData[(y - 1) * itemp->widthStep + x] +
      itemp->imageData[(y - 1) * itemp->widthStep + x + 1] +
      itemp->imageData[(y - 1) * itemp->widthStep + x + 2] / 3)
   +
   (itemp->imageData[(y + 1) * itemp->widthStep + x]  +
    itemp->imageData[(y + 1) * itemp->widthStep + x + 1] +
    itemp->imageData[(y + 1) * itemp->widthStep + x + 1] / 3)
   +
   (itemp->imageData[y * itemp->widthStep + (x + 3)] +
    itemp->imageData[y * itemp->widthStep + (x + 3) + 1] +
    itemp->imageData[y * itemp->widthStep + (x + 3) + 2] / 3)
   +
   (itemp->imageData[y * itemp->widthStep + (x - 3)] +
    itemp->imageData[y * itemp->widthStep + (x - 3) + 1] +
    itemp->imageData[y * itemp->widthStep + (x - 3) + 2] / 3)
   +
   (itemp->imageData[(y + 1) * itemp->widthStep + (x - 3)]  +
    itemp->imageData[(y + 1) * itemp->widthStep + (x - 3) + 1] +
    itemp->imageData[(y + 1) * itemp->widthStep + (x - 3) + 1] / 3)
   +
   (itemp->imageData[(y + 1) * itemp->widthStep + (x + 3)]  +
    itemp->imageData[(y + 1) * itemp->widthStep + (x + 3) + 1] +
    itemp->imageData[(y + 1) * itemp->widthStep + (x + 3) + 1] / 3)
   +
   (itemp->imageData[(y - 1) * itemp->widthStep + (x + 3)] +
    itemp->imageData[(y - 1) * itemp->widthStep + (x + 3) + 1] +
    itemp->imageData[(y - 1) * itemp->widthStep + (x + 3) + 2] / 3)
   +
   (itemp->imageData[(y - 1) * itemp->widthStep + (x - 3)] +
    itemp->imageData[(y - 1) * itemp->widthStep + (x - 3) + 1] +
    itemp->imageData[(y - 1) * itemp->widthStep + (x - 3) + 2] / 3)
   ;

ref /= 8;

if((temp + range) < ref){
   image->imageData[y * image->widthStep + x] = image->imageData[y * image->widthStep + x + 1] = image->imageData[y * image->widthStep + x + 2] = 255;
}
      }
   }
}

void Extractor::Cut()
{
   IplImage *gray = cvCreateImage(cvSize(image->width,image->height),IPL_DEPTH_8U ,1);
   cvCvtColor(image,gray,CV_RGB2GRAY);

   cvCanny(gray,gray,30,90);
   cvSmooth(gray,gray,CV_BLUR);
   cvSmooth(gray,gray,CV_BLUR);
   cvSmooth(gray,gray,CV_BLUR);

   std::multimap<int,CvRect> list;

   CvMemStorage* storage = cvCreateMemStorage( 0 );
   CvSeq* contours = NULL;
   cvFindContours(gray, storage, &contours, sizeof( CvContour ), CV_RETR_LIST,CV_CHAIN_APPROX_NONE);
   for( ; contours != NULL; contours = contours->h_next ){
      CvRect rect = cvBoundingRect( contours, 0 );
      //cvRectangle(image, cvPoint( rect.x, rect.y ),cvPoint( rect.x + rect.width, rect.y + rect.height ), cvScalar(0,0,255), 0 );
      list.insert(std::make_pair(rect.width * rect.height,rect));
   }

   //cvSaveImage("find.jpg",image);

 
   int captcha_numbers = 5;
   std::multimap<int,CvRect> result;
   std::multimap<int,CvRect>::reverse_iterator rit = list.rbegin();
   for(int i = 0;rit != list.rend() && i < captcha_numbers;++rit,++i){
      result.insert(std::make_pair(rit->second.x,rit->second));
   }

   char name[] = "1.jpg";
   std::multimap<int,CvRect>::iterator it = result.begin();
   for(;it != result.end();++it){
      cvSetImageROI(image,it->second);
      cvSaveImage(name,image);
      name[0] += 1;
      //std::cout << it->first << std::endl;
   }
}


main.cpp


#include "extractor.h"

int main(int argc,char**argv)
{
   char *name = argv[1];

   if(name){

      Extractor extractor(name);

      /*************pipeline*************/

      extractor.Average();

      extractor.BackgroundErase();

      extractor.ColorFull();

      extractor.NoiseClear();

      extractor.Cut();
   }
   return 0;
}




針對的樣本:

(這組失敗,7和8被當成同範圍)










2012年11月6日 星期二

累人...

  感覺最近又再重複做去年同樣這個時間在做的事,一直覺得太規律的事情不適合我做,工作也好學校也好太規律就渾身不自在啊啊...前些日子把很久以前寫的繪圖引擎改寫之後先試著做2D ACT遊戲引擎驗證,如果把怪物AI跟物理部分獨立出來用LUA之類的腳本個別設計就可以做任何ACT,等有時間再慢慢來寫另一個3D RPG引擎驗證。



  在沒屋頂買了一個很有趣的東西叫VFD管,整個很漂亮等找人弄到Driver IC再來設計PCB弄個時鐘。



  還有很多東西要學要研究偏偏時間很難把握,其實我自己對時間管理不是很擅長希望到過年前能完成大部分。

2012年7月23日 星期一

關於台灣基礎科學的書籍...

    其實最近對於電晶體工作原理以及應用有很大的興趣,打算找本書搭捷運時可以看,但是去翻以前一位光電Ph.D朋友送的史密斯電子學根本很難理解內容(對我來說),想說找看看有無台灣教授自己出版不錯的書籍,沒想到google根本沒看到幾人推薦,大多數還是都推薦史密斯那本,後來看對岸的網站他們有人推日本人寫的專門講電晶體的書給非電子背景看的,看了一下確實不錯,不過我發現連對岸網友推他們自己國內教授出版的其實也不多(他們最奇怪的是某大學研究GPU Architecture的團隊自己出版的書竟然是用英文...),所以我覺得台灣的技術力落後美日等國的一個因素就是自己出版的基礎書籍普遍不夠好,因為如果是那些所謂"聖經"翻譯書我相信翻譯者不太可能能完全把字裡行間的意義按照原文忠實呈現,更不要說譯者本身對於這領域的理解程度,還是要書籍撰寫者自己完全消化甚至真的實驗過知道原因才好,如果我們的基礎書籍有不錯的質量相信整體技術實力水平能提昇不少,更不要說特定專門領域書籍一直缺乏,比如Realtime Rndering相關連翻譯都沒有,當然這類書籍要翻譯的好也不容易,大陸出版的目前看來還是不如去買原文算了XD但是最少他們出版社會去蒐集意見下次出版相關書籍時改進,所以我希望台灣的圖書不管翻譯還是自己出本質量都能在提高。

2012年6月18日 星期一

德州儀器的效率超高!

    幾天前跟TI申請一些IC沒想到今天就收到FedEx的包裹了,而且還只是樣品而已!運費關稅都由TI負擔然後這次申請PCM * 3、OPA * 1、ADC * 1這些IC在露天拍賣買大概要NTD:1000up,預計接下來要再跟TI買些IC,以前跟台灣某某某廠買萬把塊的零件居然要一個多禮拜才收到...如果想跟TI申請樣品直接上他們的官方網站註冊帳號,然後搜尋想要的樣品,不一定每一種都有樣品可以申請,至於公司我想應該填寫學校就可以了,我是填寫以前案子客戶的公司。



2011年8月30日 星期二

一些還不錯的書

前些日子同學直屬學弟說他也讀資工叫我推一些書,後來我就翻一些以前高中買的書給他這樣,所以我就想說紀錄一些我看過來不錯的書給有需要的參考,寫出來的都看過不下N次,除了講D3D10的要shader環境我的顯卡沒辦法外其他都有實驗過。

侯捷C++系列:
    1. C++ Primer 4/E
    2. C++ Templates全覽
    3. C++物件模型(絕版)
    4. STL源碼剖析(絕版)
    5. 泛型程式設計與STL(絕版)
    6. Effective C++ 3/e
    7. More Effective C++
    8. Exceptional C++
    9. C++設計新思維:泛型編程與設計範式之應用
    10. C++編程規範
    11. 多型與虛擬(絕版)
    絕版的都是當時看的時候,現在應該也有幾本是買不到的要去圖書館借,目前COM本質論還丟著沒時間認真研究,這本也是絕版的。

    其他:

    1. Windows程式設計(王豔平 著,這本都講win api重點部份搭配MSDN學很快,當初看他有講簡單的Dll Inject就買了,MFC部份可以跳過因為直接衝wxWIdgets會比較好XD)
    2. 3D繪圖程式設計(彭國倫 著,這本大推不過要注意顯卡支不支援shader的部份)
    3. Assembly Language for Intel-Based Computers 5/E (貝殼書,講MASM有人說有點學院派但是我覺的寫的很好理解)
    4. C語言之修煉與實踐(用GCC+GDB+VIM當教學環境蠻特別的,也有講一些基礎資料結構)
    5. 加密與解密3/e(看雪出的大多講逆向分析算是比較全面)
    6. 0 DAY安全軟體漏洞分析技術(主要講buffer overflow目前出第二版了)
    7. 揭密-資料解密的關鍵技術(原本以為是單純逆向,結果其實是在講怎麼拆遊戲資源,有對一些圖像格式做講解,然後有注意到它拆的遊戲是ef-the first tale...其實要看這類可以去一些字幕組的漢化教學找到一些不錯的資源XD)
    8. 最間單的互動設計Arduino一試就上手(Arduino我只看這本,因為其實很多Arduino的書都寫的一樣有差別的都是控制元件,換句話說要對電機電子學多做研究會比較好,另外就是聽作者說要出第二版嚕XD)
    其他還有很多網路找的些謎版ebook跟資料都不錯,這些算是比較好入門的,寫這是因為以前自己摸索遇到爛書浪費不少時間又不知道它寫錯只能上網慢慢股狗這樣XD

    2011年8月16日 星期二

    Focus



    這幾個月注意力真的超不集中ORZ...,主要是關注太多項目而且又同時執行...XD,所以我想還是要把注意力集中在遊戲上,目前遊戲製作的進度一直停在二月,當初設定兩年完成的時間也剩一年半了...,最大的原因就是當初很執著要用Arduino控制機器人,在洗電路板還有焊接那邊搞了三週(雖然現在覺的這兩招很實用XD),然後Arduino終於能自製了又發現三合一體積太大,所以又從機構下手改造,而作機構也很複雜,光是要爬文爬到可以讓我用手加工又能有壓克力強度的材料也是搞了好幾周...,其實當初就有SSC32的選擇,但是我就是想整台DIY(電路+機構+程式),最後出來的東西功能都有但是不甚理想,也因為馬達太便宜力量不夠不能使用仿多足生物步伐(抬腳速度太快會垮掉),總結就是我必續決定專注幾個項目,然後用下半年去執行,畢竟下半年也快過三分之一暑假也剩一個月了...,這個暑假搞轉學也是消耗很多時間去了...,所以我有想下半年三個優執行先事項,先把遊戲DEMO做出、英文要加強、最後就是用空閒時間練習很久沒搞的Reverse跟素描,還有就是最近辦了Desire HD花光所有積蓄,不過它可以拿來取代我被拿走的DC(上圖就是它拍的,也能錄影)而本身OS是Android可以讓我寫用藍牙控制下一台要做的機器人的程式XD


    2011年8月4日 星期四

    Tube Clock




     
    今天吃飯前用這空檔把管鐘的板子洗出來了,曝光圖檔是M01上一位大大改良的 :http://www.mobile01.com/topicdetail.php?f=181&t=2206805&p=1 ,目前材料大概也都蒐集到了,但是還少一顆叫74HC4013的IC,等這顆找到才會開始來焊接,另外就是因為我不會洗雙面板,所以只好用單面洗兩張到時候焊接再把洞對準即可(沒試過不確定XD),還有那種很小的好像叫SMD的電阻跟電容我沒有黏過這種材料,所以可能還是要先練習才能上XD總之跟某位大大說的一樣,管子沒亮看起來就很讚了真希望它趕快亮起來XD

    2011年7月31日 星期日

    好的開始

    很久以前(那時候連LED都不會控制XD)一直想做的六足在本月比較密集動工,今天終於讓它站立了,我相信這是踏入機器人領域一個好的開始XD突然也想把這個設定為兩年的project了XD跟現在在做的遊戲一樣(已經做半年了XD),最終結果是希望能夠有自己開發的N軸向PC端控制款體,還要有視覺系統以及可以安裝一樣配件(機器手或電槍之類的XD),,雖然目前能夠站立,但是必須要先騰空設定好姿勢在放到地上,沒辦法在關閉狀態然後在地上自己站起來(太重),應該要把大腿的部份縮短減少槓桿,還有電池實在太重了,給控制板的9V鹼性電池加上電池殼約56g,然後給Servo的四顆鎳氫電池加上電池盒要147g....比用TAMIYA的プラ板做的機構全部還重...而且第二層太高也要修該一下高度,不過我想完全修改完還是只能用波型步態,三腳步態可能還是很沒力而且又不穩定,雖然SG90這顆Servo號稱給4.8v能有1.8公斤的輸出力,不過我沒有用彈簧拉伸量的方式去測試,所以我猜它要再打個八折約1.44kg的輸出而已,電池應該會改用模型用的四、五顆包成一包那種感覺會比較輕,然後控制就是RF+WII雙節棍這個比較沒問題,等重量問題解決了大概步態一下子就能寫出來了XD

    2011年5月9日 星期一

    哈囉!

    關於這裡我想用它來紀錄一些筆記讓我日後需要時可以回顧:)