Saturday, July 9, 2016

เอามอเตอร์ปั๊มน้ำ 1 แรงมาพันใหม่

ต้องการทำ Dust Separator สำหรับโรงช็อฟ ซึ่งต้องการมอเตอร์มาทำ Blower จึงเอามอเตอร์ปั๊็มน้ำที่ขดลวดไหม้มาพันใหม่









มอเตอร์นี้เป็นแบบ 2 โพล ซึ่งจะมีความเร็วรอบอยู่ที่เกือบ 3000 รอบ จึงเหมาะมากกับการทำเป็น Blower

มอเตอร์มี 24 สล็อต แต่ละโพลจะมีขดลวด 3 ชุด มีวงนอก วงกลาง และวงใน

สูตรการพันอยู่บนกระดาษแผ่นนี้


รู้สึกว่าจะใช้ C 25uF

สรุปแล้ว หมุนดีใช้ได้


พันมอเตอร์พัดลมฮาตาริ 18 นิ้ว


เป็นการพันมอเตอร์ตัวที่ 3 ถ้าไม่นับการพันมอเตอร์ DC 36 ของจักรยานไฟฟ้าที่ไหม้เพราะ Overload

จู่ๆ พัดลมฮาตาริที่ใช้ในโรงช็อฟก็ช๊อตขึ้นมา ดูแล้วเหมือนมันช็อตกันตรงขั้ว ขดลวดไม่ได้ไหม้ แต่ไล่ไม่ถูก  สุดท้ายก็ตัดสินใจพันขดลวดใหม่

ระหว่างรื้อขดลวดเก่าออก



หลังจากพันใหม่





เนื่องจากมอเตอร์นี้มี 24 สล็อด แต่ละโพลมี 2 ขด วงนอกกับวงใน จึงไม่รู้วงจรที่จะทำให้ปรับความเร็วได้ 3 ระดับ จึงตัดสินใจพันมันความเร็วเดียวนี่แหละ

สูตรการพัน (นับรอบจากมอเตอร์ตัวเดิม)


ขด RUN วงนอก 300 รอบ    (ตั้งชื่อขั้วขดลวด  R1A  --  R1B)
ขด RUN วงใน    150 รอบ     (ตั้งชื่อขั้วขดลวด  R2A  --  R2B)
ใช้ลวด 0.3mm คนขายเทียบให้เป็นเบอร์ 30

ขด START วงนอก 430 รอบ    (ตั้งชื่อขั้วขดลวด  S1A  --  S1B)
ขด STARTวงใน    215 รอบ     (ตั้งชื่อขั้วขดลวด  S2A  --  S2B)
ใช้ลวด 0.25mm คนขายเทียบให้เป็นเบอร์ 34

ขด RUN กับขด START วงในมันใช้สล็อตร่วมกัน

พันแล้วยังเหลือที่ว่างในสล็อต สงสัยคนขายลวดเทียบเบอร์ผิด แต่ไม่เป็นไรเพราะลงลวดง่าย และไม่น่าจะร้อน

ขด RUN วงนอกใช้แบบ 4x7.4 cm  วงในใช้ 2.5x6 cm

ขด START วงนอกปรับแบบให้เส้นรอบวงสั้นลงประมาณ 1cm ส่วนวงในใช้ขนาดเท่ากับขน RUN 

โดยรวมคิดว่าแบบใหญ่ไป แต่ไม่เป็นไรเพราะลงลวดง่ายดี และตัวมอเตอร์มีที่เหลือ ลวดไม่ชนโครง

ใช้ C 2.5uF

ความกว้างแบบพันลวดทำให้เท่ากับความกว้างปากสล็อต ทำให้ใส่ง่าย

พันเชือกอย่างแน่น  ชุปวานิช

การต่อวงจร

ขั้นแรก เอาขดวงในกับวงนอกมาอนุกรมกัน
  • R1B ต่อกับ R2A
  • S1B ต่อกับ S2A
Line ต่อกับ R1A ซึ่งต่อกับ S1A
Neutral ต่อกับ R2B ซึ่งต่อกับขั้วหนึ่งของ C และอีกขั้วนึงของ C ต่อกับ S2B

สรุป 


ใช้ได้ ไม่ร้อน ต้องใช้งานต่อไปว่าจะทนได้กี่วัน ??






Saturday, February 20, 2016

How fast is an Arduino Nano pin?

I wonder how fast I can toggle an I/O pin of Arduino Nano (ATMEGA328 running at 16MHz)?

With this simple code:


void setup() {
  pinMode(12, OUTPUT);
}

void loop() {
  digitalWrite(12, LOW);
  digitalWrite(12,HIGH);
}

I monitored pin D12 with my oscilloscope and found that it takes 5uS for each level. Thus the code gives 100kHz square wave as shown in the figure below. Note that oscilloscope setting was 5 uS/DIV.



Now I modified the above code such that it directly writes to PORTB (pin D12 is mapped to bit B4 of PORTB). This avoids using digitalWrite() function. The modified version of the code is shown below:

void setup() {
  pinMode(12, OUTPUT);
}

void loop() {
  PORTB = B00000000;
  PORTB = B00010000;
}

Result: (0.5 uS/DIV)



The frequency of the waveform is around 1.11 MHz which is about 10 times faster than using digitalWrite(). However the waveform does not look symmetry. Duration of the HIGH is around 0.8uS while that of the LOW is around 0.1uS.

I then swap the 2 line of code:

From
  PORTB = B00000000;
  PORTB = B00010000;

to
  PORTB = B00010000;
  PORTB = B00000000;

The result was: (again 0.5uS/DIV)



Obviously, the duration of the HIGH and the LOW are swapped. I think the reason is the Arduino loop takes around 0.7uS.


Conclusions:

  • Write directly to port is much faster than using digitalWrite().
  • Arduino loop() takes about 0.7 uS to execute.





Tuesday, September 22, 2015

พันมอเตอร์พัดลม

เอาพัดลมบ้านแม่ภรรยามาพันใหม่ เป็นพัดลมโคจร ติดเพดาน ยี่ห้อมิตซูบิชิ  

เป็นพัดลมที่ปรับความเร็วได้ 3 ระดับ ข้างกล่องปรับความเร็วมีสวิตซ์ปิดเปิดสำหรับจ่ายไฟให้มอเตอร์ซิงโครนัสที่ทำหน้าที่ขับพัดลมให้ส่าย (แบบหมุนรอบตัว) 

ที่ตัวมอเตอร์พัดลมจะมีสาย 3 เส้น เส้นแรกเป็นเส้นร่วม เส้นที่ 2 เป็นไฟเลี่ยงมอเตอร์พัดลม เส้นที่ 3 เป็นไฟเลี้ยงมอเตอร์ส่าย  แต่ช่างที่เดินสายไว้เดินสายไปแค่ 2 สาย โดยรวบสายที่ 2 กับ 3 เข้าด้วยกัน ทำให้พัดลมส่ายตลอดเวลา และแรงดันที่จ่ายให้มอเตอร์ส่ายไม่คงที่เพราะแปรตามความ speed พัดลม แต่ไม่น่าจะมีปัญหาอะไร

ในกล่องคุมความเร็ว มีฟิวส์ป้องกันอยู่ แต่ฟิวส์ขาดไปแล้ว และมี C 2 ค่าในตัวเดียวกันเพื่อใช้ในการปรับความเร็วพัดลม  

ความเร็วสูงสุด ต่อ 220 โวลต์ตรงๆ 
ความเร็ว ต่ำลงมา ต่อไฟผ่าน C เพื่อลดแรงดัน


ความเสียหาย: มีขดลวดใหม้

มอเตอร์ใช้แบริ่ง มีเสียง แต่ยังหมุนลื่นดี

ขนาดมอเตอร์พัดลม

  • แกนหนา 25 mm
  • รูกลางน่าจะประมาณ 42-43 mm
  • มี 16 slot
  • พันลวดไว้ speed เดียว
  • ใช้ C 1.5uF

ขดรัน 650 รอบ พันก้น slot
ขดสตาร์ท 740 รอบ ทับทีหลัง แต่คนละร่อง
วัดขนาดลวดเก่าได้ประมาณ 0.2 mm เทียบเป็นเบอร์ลวด 35 คนขายลวดว่า เล็กกว่าเดิมนิดนึง
จริงๆ วัดได้ 0.2 mm มันจะเทียบเป็นเบอร์ ประมาณ 32 แต่ช่างบอกคิดอย่างนั้นไม่ได้ มันมีความหนาของฉนวนด้วย ต้องใช้ความกว้างของปากไมโครมิเตอร์หรือเวอร์เนียร์เทียบเอา  ถ้าจะวัดขนาดจริงแล้วเปิดตาราง ต้องขูดฉนวนออก


ปัญหาที่พบ

  • ทำแบบพันลวดยาก
  • ถอดลวดออกจากแบบยาก
  • ที่วัดรอบไม่แม่น ขดสตาร์ตขดนึงพันเกินไป 100 รอบ ยัดเกือบไม่เข้า
  • สายที่ต่อระหว่างขดเหลือยาวเกิน
  • ยัดลวดลงสล๊อตยากเหลือเกิน ใช้เวลามาก
  • เชื่อกผูกขดลวด ชอบคลาย ใช้ไหมถักของภรรยา
  • วานิชเหม็น เหมื่อนไม่แห้งสนิท
  • โอกาสลงลวดผิดทิศสูง

รูปมอเตอร์ ก่อนซ่อม











รูปมอเตอร์หลังพันแล้ว








Wednesday, June 17, 2015

DIY แปลงเครื่องตัดหญ้าแบบสะพายเป็นแบบเข็น

แม้พื้นที่รอบๆ บ้านจะไม่กว้างมาก แต่เวลาที่ใช้ในการตัดหญ้าก็แต่ละคร้ังก็ไม่ต่ำกว่า 1-2 ชั่วโมง กว่าจะตัดเสร็จก็เมื่อย+มึน  เมื่อยเพราะต้องสะพายเครื่องตัดหญ้า มึนเพราะต้องดมกลิ่นควันจากท่อไอเสียของเครื่อง  ตอนตัดก็ต้องคอยระวังเศษหินกระเด็นใส่

เครื่องตัดหญ้าแบบสะพายบ่าที่ใช้เป็นยี่ห้อ Kawasaki มือ 2 ที่ซื้อมาเมื่อ 3 ปีก่อน เครื่องมันก็พอใช้ได้ สตาร์ทติดง่าย (หลังจากที่เคาะเขี้ยวหัวเทียนให้ชิดนิดนึง ทำให้สตาร์ทติดง่ายและไม่ดับตอนเครื่องร้อน) ปัญหาหลักคือเร่งไม่ค่อยขึ้น อาจเป็นเพราะคลัทช์ลื่น เครื่องไม่มีแรง หรืออัตราทดเกียร์ที่ใบมีดไม่เหมาะสมก็ไม่ทราบ กว่าจะเร่งให้ได้ถึงรอบต้องยกใบมีขึ้นก่อน เร่งเครื่องแล้วรอสักพักพอรอบถึงจึงจะตัดได้ และพอเจอหญ้าหนาๆ ก็จะหมดแรงเอาง่ายๆ

จึงเกิดความคิดที่อยากมีเครื่องตัดหญ้าแบบเข็นที่สามารถตัดหญ้าในพื้นที่ราบได้อย่างรวดเร็ว และมีอุปกรณ์ป้องกันเศษวัสดุกระเด็นเข้าหน้าเข้าตาได้ดีกว่าแบบสะพาย  แต่เท่าที่สังเกต เครื่องตัดหญ้าแบบเข็นน่าค่อนข้างแพง จึงคิดดัดแปลงเครื่องตัดหญ้าแบบสะพายที่มีอยู่ให้เป็นแบบเข็น โดยยึดเข้ากับรถเข็น

เริ่มต้นก็คิดว่าจะทำรถเข็นขึ้นเอง แต่จำได้ว่าเคยซื้อรถเข็น 3 ล้อมาคันนึงจากแมคโคร ไม่ค่อยได้ใช้งาน จึงตัดสินใจว่าใช้รถเข็น 3 ล้อนี่แหละ

การทดลองแรกเพื่อทดสอบความคิดว่าจะใช้ได้ไหมก็เอาเครื่องตัดหญ้าผูกเข้ากับรถเข็น โดยเอาใบมีดสอดลงไปข้างใต้รถเข็น แม้การใช้งานค่อนข้างลำบาก เพราะเพลาเครื่องตัดหญ้าค่อนข้างยาว ทำให้เครื่องห้อยไปข้างหลังรถเข็น ทำให้หัวรถเข็นกระดก ต้องเอาถังน้ำไปวางไว้ที่ด้านหน้ารถเข็น แต่ก็พิสูจน์ว่าวิธีการนี้ใช้ได้

สุดท้ายก็ตัดสินใจตัดเพลาเครื่องตัดหญ้าให้สั้นลงให้พอดีกับขนาดรถเข็น ต้องตัดทั้งปลอกนอกของเพลาที่เป็นท่ออลูมิเนียม และต้องตัดเพลาในซึ่งเป็นเหล็กเส้นกลม จากนั้นเจียร์ปลายเพลาให้เป็น 4 เหลี่ยมเพื่อให้สอดเข้าไปในชุดเกียร์ได้ (โชคดีที่รูเป็น 4 เหลี่ยม จึงทำเองได้ง่ายๆ แต่เห็นบางรุ่นรูเป็นแฉก คงทำเองได้ยาก)

การตัดเพลาเครื่องตัดหญ้าให้สั้นลงก็ต้องทำใจว่าหลังจากนี้คงนำมาใช้งานแบบเดิมไม่ได้แล้ว แต่ก็ไม่ได้เสียดายเพราะเครื่องมันเก่าแล้ว และไม่ค่อยดีแล้ว และมันใช้งานได้ดีตอนเร่งเครื่องค้างไว้ที่รอบสูงๆ เท่านั้น ซึ่งไม่เหมาะกับการเล็มหญ้าอยู่แล้ว

ส่วนท่อไอเสีย ได้ต่อท่อยาว ออกไปด้านข้าง เพื่อไม่ให้ไอเสียพุ่งเข้าหน้าตรงๆ

ส่วนของคันเร่งก็ย้ายมายึดกับด้ามจับของรถเข็น ทำให้ใช้งานได้สะดวก

ผลที่ได้ดูจากวิดีโอครับ




ผลจากการใช้งานจริงพบว่า วิธีนี้ตัดหญ้าได้เร็วกว่าวิธีเดิมมาก และได้หญ้าที่สั้นกว่าเดิม เพราะสามารถลดใบมีให้ขนานกับพื้นในระดับที่ใกล้พื้นมากๆ ได้  วิดีโอไม่ที่เห็นถ่ายทำตอนยังไม่ได้ใส่แผ่นป้องกันเศษวัสดุกระเด็น ตอนนี้ได้ใส่แผ่นไม้อัดป้องกันไว้ทั้ง 3 ด้าน (เว้นด้านหน้า) สามารถตัดได้อย่างสบายใจ ปลอดภัยแน่นอน

ข้อเสียตอนนี้คือควันจากท่อไอเสียมันเข้าจมูก  เวลาใช้ต้องดูทิศทางลให้ดี  ดมมากๆ จะเวียนหัว  วิธีแก้ที่คิดไว้จะต่อท่อไอเสียขึ้นไปแนวสูง ให้สูงพ้นหัวไป น่าจะลดควันได้มากทีเดียว

First experiment with Tiny85 Arduino

ทดลองเล่นบอร์ด Arduino DigiSpark Tiny85 ขนาดจิ๋ว มี 6 I/O ให้ใช้  ซื้อบอร์ดมาจากอีเบย์  preload มาด้วย Bootloader ทำให้ง่ายต่อการพัฒนาโปรแกรม
    การเตรียมโปแกรม (สำหรับ Windows)
  1. ดาวน์โหลด Arduino และ Driver สำหรับบอร์ดจาก ที่นี่
  2. Unzip ไฟล์ที่โหลดมาแล้วเข้าไปที่ โฟลเดอร์ DigisparkWindowDriver แล้วรันโปรแกรม InstallDriver.exe
  3. ไปที่โฟลเดอร์ Digispark-Arduino-1.0.4 แล้วรัน Arduino
  4. ใน Arduino ให้เลือกบอร์ดเป็น Digispark (Tiny Core) เลือก Programmer เป็น Digispark แล้วเลือก Serial Port ให้ถูกต้อง
  5. เปิดไฟล์ตัวอย่างมาลองเล่นดู เริ่มจาก Blink ก่อน เปลี่ยนพอร์ตของ LED เป็น พอร์ต 1
  6. ก่อน Load โปรแกรม จะต้องถอดบอร์ดออกจากพอร์ต USB ก่อน จะมีข้อความบอกให้เสียบบอร์ดเข้าไป โดยต้องทำภายใน 60 วินาที
  7. เมื่อเสียบบอร์ดเข้าไปกับพอร์ต USB โปรแกรมจะโหลดโปรแกรมของเราลงบอร์ดแล้วรันโปรแกรมทันที  ถ้าไม่มีอะไรผิดพลาดโปรแกรมก็จะทำงานตามที่ต้องการ

    การต่อไอซีวัดอุณหภูมิ DS18B20 
  1. ต่อ VCC (สายสีแดง)  และ GND (สายสีดำ) ของเซ็นเซอร์เข้ากับบอร์ด Tiny85 
  2. ต่อ สาย Data (สายสีเหลือง) เข้ากับพอร์ต P2 ขอบ Tiny85 ต้องต่อตัวต้านทาน 4.7K pull-up กับ VCC ด้วย

    การต่อ Bluetooth HC-05
        ฺBluetooth นี่ เอาไว้รับค่าจากบอร์ด Tiny85 แล้วส่งออกอากาศ  เราสามารถใช้ เครื่องคอมพิวเตอร์ connect กับ Bluetooth เพื่อ ดูค่าอุณหภูมิได้
  1. ต่อ VCC และ GND กับบอร์ด Tiny85
  2. ต่อขา RX ของ HC-05 เข้ากับพอร์ต P3 ของ Tiny85
  3. Connect computer กับ Bluetooth ใช้รหัสผ่าน 1234 ฺ
  4. เปิดโปรแกรมที่รับส่งข้อมูลทาง Serial Port เช่นโปรแกรม HyperTerminal  เซ็ต Baud Rate 9600

การต่อบอร์ดรีเลย์
    เราจะต่อบอร์ดรีเลย์ เพื่อทำการตัดต่อเครื่องใช้ไฟฟ้าเมื่ออุณภูมิสูงกว่าที่กำหนด เลือกใช้รีเลย์ 5 โวลต์เพราะจะได้ไม่ต้องมีแหล่งจ่ายไฟหลายชุด  แต่ดูท่าแล้วตัวที่ใช้จะไม่ค่อยทนเท่าไหร่ การต่อก็ต่อเข้ากับพอร์ต 0  (ลองต่อเข้าพอร์ต 5 แล้วบอร์ด Tiny85 หยุดทำงาน)
    นี่คือโค๊ด


#include <SoftSerial.h>     /* Allows Pin Change Interrupt Vector Sharing */
#include <TinyPinChange.h>  /* Ne pas oublier d'inclure la librairie <TinyPinChange> qui est utilisee par la librairie <RcSeq> */
#include <OneWire.h>

SoftSerial mySerial(2, 3); // RX, TX

#define DS18S20_ID 0x10
#define DS18B20_ID 0x28

int temp;
int led = 1;
int relay = 0;

OneWire ds(2);

byte data[12];
byte addr[8]; 
char str[8];


boolean readTemperature(){

  //find a device
   
   
 if (!ds.search(addr)) {
   ds.reset_search();
   return false;
 }
   if (OneWire::crc8( addr, 7) != addr[7]) {
   return false;
 }
   if (addr[0] != DS18S20_ID && addr[0] != DS18B20_ID) {
   return false;
 }
 
   ds.reset();
   ds.select(addr);
   // Start conversion
   ds.write(0x44, 1);
   // Wait some time...
 }
  
boolean getTemperature(){
     byte i;  
       byte present = 0;
 present = ds.reset();
 ds.select(addr);
 // Issue Read scratchpad command
 ds.write(0xBE);
 // Receive 9 bytes
 for ( i = 0; i < 9; i++) {
 data[i] = ds.read();
 }
 // Calculate temperature value
 temp = ((data[1] << 8) + data[0] )*0.0625;

 
 str[0] = (data[1]>>4) + 0x30;
 str[1] = (data[1]&0xF) + 0x30;
 str[2] = (data[0]>>4) + 0x30;
 str[3] = (data[0]&0xF) + 0x30;
 str[4] = 10;
 str[5] = 0;
 
 if (temp > 33) {
   digitalWrite(led, HIGH);
   digitalWrite(relay, HIGH);
 } else {
   digitalWrite(led, LOW);
   digitalWrite(relay, LOW);
 }
 
 if (temp > 99)
 {
   str[0] = '1';
   temp -= 100;
 }
 else {
   str[0] = '0';
 }

  str[1] = temp/10 + 0x30;
  str[2] = temp%10 + 0x30;
  str[3] = 10;
  str[4] = 0;
  return true;
}

void setup(){
  
  pinMode(led, OUTPUT);
  pinMode(relay, OUTPUT);
  
  mySerial.begin(9600);
  delay(1000);
}

void loop(){

  readTemperature();
  delay(100);
  getTemperature();
  mySerial.write(str);
  delay(10); 
}