Main Menu
Menu

Show posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.

Show posts Menu

Topics - pken

#1
AVR and Arduino / LCD and button sharing I/O
March 22, 2016, 07:07:01 PM
อีกแบบสำหรับการใช้ขาร่วมกัน ที่เป็นทั้ง output และ input ให้กับขา Arduino ที่ใช้งานอยู่แล้วโดยเพิ่ม switch ที่ต้องการ โดยการต่อ pull down ผ่าน R 4.7K เข้ากับขาที่ขับสัญญาณ ไปยัง LCD (DB4-DB7)
ที่มา http://www.74hc.co.uk/lcd-and-button-sharing-io/

#include <LiquidCrystal.h>

// Pin Map, matches Arduino HelloWorld example
const byte lcdEnable = 11
const byte lcdRS = 12;
const byte db4 = 5;
const byte db5 = 4;
const byte db6 = 3;
const byte db7 = 2;

LiquidCrystal lcd(lcdRS, lcdEnable, db4, db5, db6, db7);

void setup(){
  lcd.begin(16, 2);
  lcd.print("74HC.co.uk");
  setBus_Input();
}

void loop(){
  if(digitalRead(db4) == LOW){
    setBus_Output();
    lcd.setCursor(0, 1);
    lcd.print("DB4");
    setBus_Input();
    delay(500);
  }
  else if(digitalRead(db5) == LOW){
    setBus_Output();
    lcd.setCursor(0, 1);
    lcd.print("DB5");
    setBus_Input();
    delay(500);
  }
  else if(digitalRead(db6) == LOW){
    setBus_Output();
    lcd.setCursor(0, 1);
    lcd.print("DB6");
    setBus_Input();
    delay(500);
  }
  else if(digitalRead(db7) == LOW){
    setBus_Output();
    lcd.setCursor(0, 1);
    lcd.print("DB7");
    setBus_Input();
    delay(500);
  }
}

// A function to set the pins to input
void setBus_Input(){
  pinMode(db4, INPUT_PULLUP);
  pinMode(db5, INPUT_PULLUP);
  pinMode(db6, INPUT_PULLUP);
  pinMode(db7, INPUT_PULLUP);
}

// A function to set the pins to output
void setBus_Output(){
  pinMode(db4, OUTPUT);
  pinMode(db5, OUTPUT);
  pinMode(db6, OUTPUT);
  pinMode(db7, OUTPUT);
}



ข้างล่างนี้ผมนำ code นี้ไปเพิ่มใส่ กับ code ของเดิมที่ใช้วัดอุณหภูมิโดยมี Thermistor เป็น sensor และกำหนด Hysteresis =2
หรืออาจจะเพิ่ม function สำหรับตั้ง Hysteresis ก็ได้ และมี eeprom เก็บค่าที่เราตั้งอุณหภูมิด้วย

  /* 
      Arduino thermistor example software
      Tutorial:  http://www.hacktronics.com/Tutorials/arduino-thermistor-tutorial
      Copyright (c) 2010 Mark McComb, hacktronics LLC
      License: http://www.opensource.org/licenses/mit-license.php (Go crazy) 
     
      Modified: Pken 20/03/16
      Resistor pull down using 4k7 or 10k work just fine.
  */
 
  #include <LiquidCrystal.h>
  #include <math.h>
  #include <EEPROM.h>
 
  float settemp; // make a variable called temp
 
  int led =13;

  //int sw_up = 7;
  //int sw_dn = 6;
  int tempPin = A5;     // thermistor is at A5
  int hys = 2; // Hysteresis = 2 C
 
  /*
  See tutorial for Thermistor connections
 
  LCD Connections:
  rs (LCD pin 4) to Arduino pin 12
  LCD pins d4, d5, d6, d7 to Arduino pins 5, 4, 3, 2
  */
  const byte lcdEnable = 11;
  const byte lcdRS = 12;
  const byte db4 = 5;
  const byte db5 = 4;
  const byte db6 = 3;
  const byte db7 = 2;

  LiquidCrystal lcd(lcdRS, lcdEnable, db4, db5, db6, db7);
  //LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
 
  void setup(void) {
    pinMode (led, OUTPUT);
    lcd.begin(16, 2);              // rows, columns.  use 16,2 for a 16x2 LCD, etc.
    lcd.clear();                   // start with a blank screen
    lcd.setCursor(0,0);            // set cursor to column 0, row 0
    EEPROM.read (1);            // make the eeprom address 1
    setBus_Input();
  }
 
  double Thermister(int RawADC) {
    double Temp;
    // See http://en.wikipedia.org/wiki/Thermistor for explanation of formula
    Temp = log(((10240000/RawADC) - 10000));
    Temp = 1 / (0.001129148 + (0.000234125 * Temp) + (0.0000000876741 * Temp * Temp * Temp));
    Temp = Temp - 273.15;           // Convert Kelvin to Celcius
    return Temp;
  }
 
  void printTemp(void) {
    double fTemp;
    double temp = Thermister(analogRead(tempPin));  // Read sensor
    //lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Temp:");
    lcd.setCursor(5,0);
    lcd.print(temp);
    lcd.print("C");
    setBus_Input();
   
    settemp = EEPROM.read(1); 
    delay (250);      
    if (digitalRead(db4)== LOW )
    {
    setBus_Output();
    settemp += 1;
    if( settemp > 45 )
    settemp = 45; 
    delay(200);
    EEPROM.write (1,settemp);
    }
    else{    // other wise do nothing
    }
    if (digitalRead (db5) == LOW) // if we detect a 1 on the other switch pin
    {
    setBus_Output();
    settemp -= 1;
    if( settemp < 10 )
    settemp = 10;
    delay(200);
    EEPROM.write (1,settemp);
    }
    else {
    } 
    if (temp > settemp)            // if the temperature exceeds your chosen settemp
    digitalWrite (led, HIGH);    // turn on the led
    {
    if (temp < (settemp - hys))    // settemp - hysteresis
    digitalWrite (led, LOW);       // turn off the led
    }
    lcd.setCursor (0,1);   
    lcd.print ("Set: ");
    lcd.setCursor (5,1);   
    lcd.print (settemp);
    lcd.print ('C');
    }   
    void loop(void) {
    printTemp();
    delay(200);
    }
 
    // A function to set the pins to input
  void setBus_Input(){
    pinMode(db4, INPUT_PULLUP);
    pinMode(db5, INPUT_PULLUP);
    pinMode(db6, INPUT_PULLUP);
    pinMode(db7, INPUT_PULLUP);
  }
   
    // A function to set the pins to output
  void setBus_Output(){
    pinMode(db4, OUTPUT);
    pinMode(db5, OUTPUT);
    pinMode(db6, OUTPUT);
    pinMode(db7, OUTPUT);
  }
#2

ต้นแบบวงจรนำมาจากที่นี่ครับใช้ Atmega168
https://www.pololu.com/docs/0J21/all

แต่ดัดแปลงวงจรนิดหน่อยตามอุปกรณ์ที่หาได้ และดัดแปลง Code และ Library ให้เข้ากับขาของ Atmega328
การวางอุปกรณ์มีทั้งด้านบนและด้านล่างของ PCB






นี่ไฟล์ นกอินทรีย์ v6.2
http://www.4shared.com/zip/oATH4C64ce/Arduino_3PI_Robot.html

#3
พอดีผมทำ Board ควบคุมเครื่องซักผ้าแทน Timer ที่เสีย แต่พอ Motor ทำงานมันก็ไปรบกวน Board ทำให้บอร์ด Reset
เลยนึกขึ้นได้ว่า บอร์ดเก่าของ electoday.com แห่งนี้แหละเคยมีคนมา post ไว้วิธีทำเครื่องมือทดสอบ ESD
จะได้หาทางแก้ก่อนที่เราจะไปใช้งานจริง การเกิด ESD ในแต่ละครั้งมันจะแพร่ EMI ออกมา ทำให้มันมีผลต่อการทำงานของ Board MCU

วิธีทำ

- ใช้ปืนจุดเตาแก้ส ที่ใช้ถ่านแม็กนิโต ผมซื้อ 80 บาท
- ตัดโลหะที่ปลายปืนออกประมาณ 15 mm.
- ต่อสาย ground ตามรูป

การใช้งาน

- ต่อสาย ground ของปืนเข้ากับ ground ของ Board ที่จะทดสอบ
- จ่ายไฟเข้า Board
- นำปืนไปจ่อใกล้ๆ ประมาณ 3-5 mm. ที่ไฟบวก Vcc และ Gnd ของ Board  MCU ที่จะทดสอบ และยิงใส่ที่ขา Switch ในกรณีที่มี Switch ต่ออยู่กับ input ของ MCU
- กดยิง ถ้าไม่แฮ้งค์หรือ Reset ก็คงผ่าน ถ้าตรงข้ามก็หาทางแก้กันต่อไป

* ระยะการ อาร์คจากปลายปืนถึงส่วนที่ทดสอบโดยประมาณ 1mm. = 1KV., 4mm. = 4KV.

ถ้าใครมีคำแนะนำเพิ่มเติมช่วยกรุณาด้วยนะครับ




ตัดปลายโลหะออกแล้ว

#4
AVR and Arduino / USBasp จาก spelecshop
July 17, 2013, 06:56:29 AM
USPasp ซื้อมาจาก www.spelecshop.com 150 บ.  แล้วทำตามคำแนะนำใน web
ลง driver (download จากwww.fischl.de/usbasp) แล้วใช้ไม่ได้

ใช้ windows xp ตอน update driver sofware (เสียบตัว USBasp เข้ากับ Port USB) มันจะแสดง Human interface devices
มันไม่ยักแสดง Other devices\USBasp ใครรู้วิธีแก้มั่ง ขอบคุณมากครับ
#5
PIC16F883 ทดลองไฟล์จากตัวอย่าง ใน Micro c pro  (Lcd.c) Compiled แล้ว โปรแกรมโดยใช้ pickit2, LCD แสดงผลขาดบางตัวอักษร โดยใช้ portb, RB0 - RB5 และ กำหนดขา ตรงกับหน้าที่ของขาของ LCD แต่ถ้าทดลองให้ขับ LED ติดหรือดับก็ปกติ และได้ทดลองกับ PIC16F887 (.ใช้ portb ต่อกับ LCD ตำแหน่งขาตรงกัน ) LCD แสดงผลได้ปกติครบถ้วนใน code ต้องกำหนดอะไรเพิ่มเติมหรือไม่ ดูจาก datasheet แล้วการกำหนดค่าต่างๆคล้ายกัน

ขอบคุณครับ