2016年3月19日 星期六

java on eclipse


建立project

File -> Import -> General -> Existing Project into workspace -> select root directiony ->  java\sla-printer-java-host-master


然後  run as -> java application -> SLA3DPRINTER


輸出project

File -> export -> java -> Runable jar file ->  library handle ->  Package required library into  generated JAR




2016年3月14日 星期一

畫電路圖



要設計印刷電路板有很多工具可以用選擇,像是開放原始碼軟體「KiCAD或是各式各樣的網路線上服務。在開放原始碼硬體社群中最受到喜愛的軟體是CadSoft的「EAGLE」。在這篇文章裡,你將會學習到如何使用EAGLE這個軟體來做基本的印刷電路板設計和製作ATmega微控制板的基本核心。


使用EAGLE

EAGLE是一個集合多種程式的軟體套件,每一個功能都有對應的設計過程。這次我們將會把注意力放在「電路原理圖編輯器(Schematic Editor電路板編輯器(Board Editor」上;其他的模組還包括自動佈線器(Autorouter)、元件編輯器、CAM處理軟體(CAM Processor,用來建立機械加工用的檔案)和一個編寫用戶端程式語言(User Language Programs)的介面。

我們可以從元件庫中選取要用的元件,每一個元件都會有兩種圖示,分別給電路原理圖和電路板使用。由於大部分的元件都來自不同的元件資料庫(packages),而EAGLE的元件庫允許不同的封包連結相同的元件圖示,為了簡化過程,我們做好了一個包含這次設計所需元件的RBBB資料庫 ,等之後你熟悉了設計的過程,另一個SparkFun資料將會是一個很好的跳板來開拓你的視野。

EAGLE設計的工作流程

I.     設計和尋找素材:找零件、詳讀規格、下載需要的東西和描繪藍圖。

II.    電路原理圖設計:用信號線連接各個元件。

III.   電路規則檢查(ErC): 使用人工智慧(AI helper)來檢驗電路上的錯誤。

IV.  電路板設計:將設計元件置入電路板,並設計真實的電路來連接它們。

V.   設計規則檢查(DrC): 使用人工智慧來檢驗設計上的錯誤。

建立Gerber檔和drill檔: 使用CAM處理軟體來建立機械加工用的檔案。


1.   開始製作
首先請從Cadsoftusa.com網站下載EAGLE Light Edition,並在moderndevice.com/downloads下載RBBB元件資料庫 ,將封包放入EAGLE程式資料匣中的lbr資料匣裡。


EAGLE將CAD繪圖用顏色來區分不同功能的圖層。在「電路原理圖編輯」的視窗裡,元件圖示在「符號圖層(Symbols layer)」,它的標示會在「名稱圖層(Names layer)」或「數值圖層(Values layer)」,而網絡連接(Net)則在「網路圖層(Net layer)」,你可以透過檢視(View Menu)來顯示或隱藏這些圖層。

小祕訣:請時常檢查你的工具列來確認是否繪製在對的圖層上。
1.1 打開電路原理圖編輯器,並選擇「檔案(File)」「新增檔案(New)」「電路原理圖(Schematic)」。你會得到一個警示訊息「目前不會執行任何自動正反向標注(no forward/backward annotation will be performed.)」,由於在一般的情況下你會同時開啟電路原理圖和電路板編輯器來讓它們同步化,所以這個訊息只是要告訴你還尚未打開電路板檔而已。
图片
1.2 選擇新增(Add工具,把RBBB元件資料庫裡的Frame元件置入構圖紙上,這並非必要,但這步驟很簡單,並可以讓你在之後繪製電路原理圖時不用一直調整螢幕的大小。
2.    電源迴路
這5個元件負責接受直流電源輸入並輸出一個沒有雜訊的5V電源。

正中央的圖示是一個電壓調整器,電壓調整器最重要的規格是輸出電壓(output voltage)、最大輸出電流(maximum output current)和最小電壓差(dropout voltage,輸入和輸出電位的最小差值)。L4931電壓調整器的最小電壓差僅僅0.4V,所以讓它從6V的輸入端(來自4顆3號電池)輸出5V是非常可靠的。它的供應電流可高至250mA,用來應付大部分的微控制器應用是非常足夠的。

使用兩個電解電容用來過濾電壓輸入端的雜訊,並在必要時代替沒電的電池和提供脈衝電壓。L4931建議使用至少2.2μF以上規格的濾波電容。我們這次的電路板是使用高達47μF的電容,這應該完全足以用來應付最糟糕的電池供應設備。

電源插座可能看起來很大,但這正是人機介面中一項重要的決定­:它可以很輕易的提供給一般的變壓器使用,我們將會把它安裝在電路板上,讓你可以在不需要時拿掉它,並提供一個雙針腳的輔助接頭來當作選擇性的電源線。

幾乎所有的功率二極體都有短路的保護機制,我們使用常見的4005二極體,它的額定電流為1A,使用並聯的方式來預防意外接錯的反向電源。有些其他的設計會使用串連的方式來連接,但這樣會讓我們需要額外再提供0.7V的電壓,假如我們想使用6V的電源,這樣會無法負荷。
經驗法則

  • 小圓點表示相交的兩條信號線是有連接的;沒有小圓點則表示它們只是重疊而已。
  • 使用柵格(Grid)工具,並將它的尺寸設定在0.1inch100 mil),因為最常犯的錯誤就是兩條看起來有相交但其實並沒有連線。
  • 每一條線(網絡連接或是信號線)都有獨立的名稱,就算在畫面上它們並沒有相鄰,所有名稱相同的信號線都會自動連線在一起,這個功能非常方便。假如你有很多元件都需要用連接的方式來連線,那畫面肯定是一團亂。
  • 每一個元件都應該要有一個顯而易見的名稱和量值,你會需要移動標籤來讓它們清晰易辨;運用分離(Smash)工具讓標籤從元件上分離,並可以移動或旋轉到它們適當的位置。
  • 繪製一張電路原理圖就像是要用電路組件跟其他人溝通一樣,想一下你是否已經提供所有他們需要的功能。
註釋:我們的圖示可能一開始看起來跟你螢幕上的有些不一樣,記得使用分離工具來分離標籤,然後移動它們到可輕易辨認的位置。
图片
2.1.    使用「新增(Add)」工具,選擇RBBB → Regulator,把Regulator元件放在畫面左上角的象限上,再使用新增工具來配置兩個Electrolytic_Caps元件、GND元件和+5V的信號供應元件(RBBB → Supply),如圖所示。
图片
2.2.    使用「網絡連接(Net)」工具,分別將電壓調整器的輸出和輸入端連接到兩個電容的正極,然後將電容的負極接到電壓調整器的接地線,把接地線連接到GND元件,並將電壓調整器的輸出端接到+5V的信號供應元件上。
2.3.    使用量值(Value)工具來設定兩個電容皆為47μF。
图片
2.4.    新增RBBBPower_Jack,將它放在電壓調整器的輸入端旁邊。這是一個非常標準的中心正極(center-positive)電源插座(不考慮音樂用電子設備的話),把它的中心針腳接到電壓調整器的輸入端,並將套筒端(sleeve)接地,如果跳出「是否連接網絡線段(Connect Net Segments)?」的對話框,請選擇「是」。
图片
2.5.    新增一個二極體,它會以水平的狀態出現在螢幕上,請使用「旋轉(Rotate)」工具把它負極那一面朝上,並且用「網絡連接」工具將它連接在電壓調整器的輸入端和接地端之間。
图片
2.6.    最後,選擇1×2排針(RBBB1x2_Pinhead)當作額外的選擇性電源輸入,旋轉並放置它,將其中一個針腳連接電源、另一個接地。
3.         微控制器和排針

排針的用途是連接微控制器的輸出和輸入,它提供了一個平臺給焊線和針腳。
图片
3.1.    新增微控制器晶RBBB → ATmega),把它放在電路原理圖的中央附近,把它的兩個接地接頭連接到接地訊號端。
图片
3.2.    在靠ATmega的電源供應針腳7的位置放置一個0.1μF的電容,將它分別連接電源、接地端和針腳7
图片
3.3.    將共鳴器(resonator)放置在針腳9和針腳10附近,將它的三個針腳連接如圖所示,並確認最中間的針腳有連到接地端。
图片
3.4.    將剩下的針腳全部都連接信號線(Signal line),別忘了左邊的類比參考針腳(analog referenceAREF),使用網絡連接工具讓每個針腳都接出一小段信號線,並使用標籤(Lable)工具(在網絡連接工具的下面)標籤每一段信號線。

註釋:EAGLE的群組移動功能並沒有像現在大部分的繪圖軟體那樣方便,如果你需要一次移動很多個元件,你需要先使用「變焦(Zoom)」工具來調整畫面大小,使用「群組(Group)」工具用Ctrl鍵+滑鼠左鍵點擊或框取你想要移動的元件,使用移動(Move)工具在你選擇的元件上按右鍵,在跳出的選項清單中選取移動群組(Move Group)即可。
图片
3.5.    你會發現EAGLE會給每條信號線都內建一個標籤,例如:N$2。現在請使用「命名(Name)」工具來為這些信號線重新命名,並使它們符合ATmega的針腳名稱。這部分有一點冗長乏味,假如有任何人知道比手動更改更好的方法,請一定要讓我知道。
图片
3.6.    新增1×161×91×4的排針,然後重覆之前的過程:新增信號線、新增標籤然後更改名稱。
4.         序列排針
图片
我們的資料連繫裝置是一個6針腳的排針,它連接到ATmega的序列埠(serial port),原始的Arduino控制板有一個USB端口和一個飛特蒂亞(FTDI)的晶片,用它們來將通用序列匯流排傳輸介面(USB)轉換成TTLUART傳輸介面。但這次我們不使用這個晶片,而是要使用排線來連接,這樣可以使設計變得精簡。飛特蒂亞有賣一種6針腳的排線,或者你可以使用USB-BUBFTDI Friend來連接。

6針腳排針放置在電路原理圖上,並分別連接RX(接收端)、TX(傳送端)、GND(接地端)、+5V訊號供應元件和EXT_RESET(重置功能)。
5.         便利的設計

很多設計者的設計不符合人體工學,他們使用很小的按鈕、不方便的元件配置和難以解讀的標籤,千萬不要變成這樣!這次我們的設計有一個大小合適的重置按鈕(reset button)和可以清楚辨認是否已經接上電源的LED指示燈。
图片
5.1.    如圖所示放置一個開關(switch)、10K電阻器(10k resistor)和0.1μF的電容(0.1μF capacitor),並把開關的一端連到接地端上。

正常來說開關是打開的,但當按下重置按鈕後開關會關起來。10K電阻器則連接在RESET針腳和+5V訊號供應元件的中間,這樣可以讓針腳的狀態在開關是打開的情況時不會漂浮不定而產生不穩的現象。在編寫程式的過程中,主電腦會執行重置功能並在程式啟動裝置載入程式碼之前重新設定微控制器,小顆的電容則是這個期間用來維持系統必需計時功能。
图片
5.2.    最後,新增一個LED1K限流電阻器的串連線路。
6.         檢查迴路

從工具清單中選擇「ERC」來進行電路規則檢查,你可能會得到一連串的錯誤或警告,點擊它們來進行任何必要的修正。最常見的錯誤是信號線非常接近卻沒有真的連接在一起。


更進一步



當你通過了ERC檢查,選擇「檔案(File)」 →「切換至電路板(Switch To Board)」,電腦將會詢問你是否要使用佈線編輯器(Layout editor),根據現在的電路原理圖來製作出一塊電路板。當然要!從現在開始,不論何時螢幕上都會出現電路原理圖和電路板視窗,EAGLE會讓兩個視窗保持同步的狀態,但前提是兩個視窗都是開啟的。
图片
圖7.1
現在你可以開始在電路板上繪製真實的銅線電路圖了。EAGLE可以自動幫你繪製完成,但為了能夠真的瞭解它,試著自己繪製也是一個不錯的主意。首先,你要先畫出電路板的邊界並設置一些網格空間,描繪電源線路並放置元件,然後繪製通用輸入和輸出路徑,連接板子正反兩面必要的線路(圖7.1),最後,你會在板的背面新增一個接地面(ground plane),如圖7.2所示。
图片
圖7.2
線路配置完成之後,要送去印刷電路板廠製作還剩下絲印(silk-screen)、建立Gerber檔跟drill檔的步驟。現在就跟著makezine.com/36上的文章一步一步設計你的電路板和輸出這些PCB檔吧。

自製印刷電路板——第一篇:設計電路圖
自製印刷電路板——第二篇:佈線


Reference : http://www.makezine.com.tw/make2599131456/105

Raspberry Pi + Arduino + SPI


This tutorial will show you how to communicate from your raspberry pi to your arduino using 3-wire SPI.

Requirements

  • 1 Raspberry pi (running Raspbian)
  • 1 Arduino
  • 4 wires
Your raspberry pi should be running the newest version of Raspbian.  To ensure your system is up-to-date please download and run rpi-update.


wire :

  • SS – digital 10. You can use other digital pins, but 10 is generally the default as it is next to the other SPI pins;
  • MOSI – digital 11;
  • MISO – digital 12;
  • SCK – digital 13;
Arduino Mega users – MISO is 50, MOSI is 51, SCK is 52 and SS is usually 53. If you are using an Arduino Leonardo, the SPI pins are on the ICSP header pins. See here for more information. You can control one or more devices with the SPI bus. For example, for one device the wiring would be:








Arduino

Open your Arduino ide and flash the below code to your Arduino.

Arduino code

// Written by Nick Gammon
// February 2011
/**
* Send arbitrary number of bits at whatever clock rate (tested at 500 KHZ and 500 HZ).
* This script will capture the SPI bytes, when a '\n' is recieved it will then output
* the captured byte stream via the serial.
*/
#include <SPI.h>
char buf [100];
volatile byte pos;
volatile boolean process_it;
void setup (void)
{
Serial.begin (115200); // debugging
// have to send on master in, *slave out*
pinMode(MISO, OUTPUT);
// turn on SPI in slave mode
SPCR |= _BV(SPE);
// get ready for an interrupt
pos = 0; // buffer empty
process_it = false;
// now turn on interrupts
SPI.attachInterrupt();
} // end of setup
// SPI interrupt routine
ISR (SPI_STC_vect)
{
byte c = SPDR; // grab byte from SPI Data Register
// add to buffer if room
if (pos < sizeof buf)
{
buf [pos++] = c;
// example: newline means time to process buffer
if (c == '\n')
process_it = true;
} // end of room available
} // end of interrupt routine SPI_STC_vect
// main loop - wait for flag set in interrupt routine
void loop (void)
{
if (process_it)
{
buf [pos] = 0;
Serial.println (buf);
pos = 0;
process_it = false;
} // end of flag set
} // end of loop

Raspberry Pi

With your updated rasbian system you should have the drivers that you need. Now it’s time to load them.
modprobe spi_bcm2708
modprobe spidev
Check to be sure the modules loaded:
lsmod
Module Size Used by
spidev 5944 0
spi_bcm2708 5350 0
snd_bcm2835 21681 0
snd_pcm 81170 1 snd_bcm2835
snd_seq 59528 0
snd_timer 21602 2 snd_seq,snd_pcm
snd_seq_device 6924 1 snd_seq
snd 57427 5 snd_seq_device,snd_timer,snd_seq,snd_pcm,snd_bcm2835
snd_page_alloc 5343 1 snd_pcm
i2c_bcm2708 3822 0

Raspberry Pi Code

Save the below code as spidev_test.c on to your Raspberry Pi and compile it
gcc spidev_test.c -o spidev_test
/*
* SPI testing utility (using spidev driver)
*
* Copyright (c) 2007 MontaVista Software, Inc.
* Copyright (c) 2007 Anton Vorontsov <avorontsov@ru.mvista.com>
*
* 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.
*
* Cross-compile with cross-gcc -I/path/to/cross-kernel/include
*/
#include <stdint.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <getopt.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/types.h>
#include <linux/spi/spidev.h>
#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
static void pabort(const char *s)
{
perror(s);
abort();
}
static const char *device = "/dev/spidev0.0";
static uint8_t mode;
static uint8_t bits = 8;
static uint32_t speed = 500000;
static uint16_t delay;
static void transfer(int fd)
{
int ret;
uint8_t tx[] = {
0x48, 0x45, 0x4C, 0x4C, 0x4F,
0x20,
0x57, 0x4F, 0x52, 0x4C, 0x44,
0x0A
};
uint8_t rx[ARRAY_SIZE(tx)] = {0, };
struct spi_ioc_transfer tr = {
.tx_buf = (unsigned long)tx,
.rx_buf = (unsigned long)rx,
.len = ARRAY_SIZE(tx),
.delay_usecs = delay,
.speed_hz = speed,
.bits_per_word = bits,
};
ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr);
if (ret < 1)
pabort("can't send spi message");
/*
for (ret = 0; ret < ARRAY_SIZE(tx); ret++) {
if (!(ret % 6))
puts("");
printf("%.2X ", rx[ret]);
}
puts("");
*/
}
static void print_usage(const char *prog)
{
printf("Usage: %s [-DsbdlHOLC3]\n", prog);
puts(" -D --device device to use (default /dev/spidev1.1)\n"
" -s --speed max speed (Hz)\n"
" -d --delay delay (usec)\n"
" -b --bpw bits per word \n"
" -l --loop loopback\n"
" -H --cpha clock phase\n"
" -O --cpol clock polarity\n"
" -L --lsb least significant bit first\n"
" -C --cs-high chip select active high\n"
" -3 --3wire SI/SO signals shared\n");
exit(1);
}
static void parse_opts(int argc, char *argv[])
{
while (1) {
static const struct option lopts[] = {
{ "device", 1, 0, 'D' },
{ "speed", 1, 0, 's' },
{ "delay", 1, 0, 'd' },
{ "bpw", 1, 0, 'b' },
{ "loop", 0, 0, 'l' },
{ "cpha", 0, 0, 'H' },
{ "cpol", 0, 0, 'O' },
{ "lsb", 0, 0, 'L' },
{ "cs-high", 0, 0, 'C' },
{ "3wire", 0, 0, '3' },
{ "no-cs", 0, 0, 'N' },
{ "ready", 0, 0, 'R' },
{ NULL, 0, 0, 0 },
};
int c;
c = getopt_long(argc, argv, "D:s:d:b:lHOLC3NR", lopts, NULL);
if (c == -1)
break;
switch (c) {
case 'D':
device = optarg;
break;
case 's':
speed = atoi(optarg);
break;
case 'd':
delay = atoi(optarg);
break;
case 'b':
bits = atoi(optarg);
break;
case 'l':
mode |= SPI_LOOP;
break;
case 'H':
mode |= SPI_CPHA;
break;
case 'O':
mode |= SPI_CPOL;
break;
case 'L':
mode |= SPI_LSB_FIRST;
break;
case 'C':
mode |= SPI_CS_HIGH;
break;
case '3':
mode |= SPI_3WIRE;
break;
case 'N':
mode |= SPI_NO_CS;
break;
case 'R':
mode |= SPI_READY;
break;
default:
print_usage(argv[0]);
break;
}
}
}
int main(int argc, char *argv[])
{
int ret = 0;
int fd;
parse_opts(argc, argv);
fd = open(device, O_RDWR);
if (fd < 0)
pabort("can't open device");
/*
* spi mode
*/
ret = ioctl(fd, SPI_IOC_WR_MODE, &mode);
if (ret == -1)
pabort("can't set spi mode");
ret = ioctl(fd, SPI_IOC_RD_MODE, &mode);
if (ret == -1)
pabort("can't get spi mode");
/*
* bits per word
*/
ret = ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &bits);
if (ret == -1)
pabort("can't set bits per word");
ret = ioctl(fd, SPI_IOC_RD_BITS_PER_WORD, &bits);
if (ret == -1)
pabort("can't get bits per word");
/*
* max speed hz
*/
ret = ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed);
if (ret == -1)
pabort("can't set max speed hz");
ret = ioctl(fd, SPI_IOC_RD_MAX_SPEED_HZ, &speed);
if (ret == -1)
pabort("can't get max speed hz");
printf("spi mode: %d\n", mode);
printf("bits per word: %d\n", bits);
printf("max speed: %d Hz (%d KHz)\n", speed, speed/1000);
transfer(fd);
close(fd);
return ret;
}



Reference : http://mitchtech.net/raspberry-pi-arduino-spi/

Reference : http://tronixstuff.com/2011/05/13/tutorial-arduino-and-the-spi-bus/