วันศุกร์ที่ 30 ธันวาคม พ.ศ. 2559

Arduino Attiny85 แสดงข้อความออกจอ LCD

วิธี ใช้งาน Arduino Attiny85 แสดงข้อความออกจอ LCD พร้อมโคดตัวอย่าง ใช้ได้ใน 3 นาที


ATtiny85 จอ LCD สามารถติดต่อกันได้ง่าย ๆ ตามบทความนี้


Attiny85 LCD การต่อใช้งาน เนื่องจาก Attiny85 มีขาให้ใช้งานเพียงแค่ 8 ขา ปกติจอ LCD จะต้องใช้หลายขาในการควบคุมซึ่งถ้าต่อแบบปกติอาจจะมากว่าขาของ Attiny85 ที่เรามีก็ได้ ดังนั้นจึงใช้ โมดูล I2C LCD มาช่วย ทำให้เหลือการใช้งานควบคุมจอ LCD เพียง 2 ขา ผ่านทางอินเตอร์เฟส I2C ทางขา SCL , SDA ปัญหาติดที่ว่า Attiny85 ของเรา ไม่มีขานี้มาให้ด้วย แต่ไม่เป็นไรครับ เราสามารถใช้ SoftWare I2C ช่วยได้ เป็นการจำลองการติดต่ออุปกรณ์ทาง I2C โดยใช้โปรแกรมมาช่วย วิธีการใช้งานทำได้ดังนี้ครับ

1. ดาวน์โหลด ไลบารี Attiny85 LCD Library คลิกที่นี่ จากนั้นติดตั้งแบบปกติ
2. อัพโหลดโปรแกรมตัวอย่าง โดยใช้บอร์ดโปรแกรมเมอร์ ในที่นี่จะใช้ Arduino Uno เป็น Arduino As ISP ในการเขียนโปรแกรมลง Attiny85




#include "TinyLiquidCrystal_I2C.h"
#include "TinyWireM.h"// original lib include

LiquidCrystal_I2C lcd(0x27,16,2);

void setup()
{
  lcd.init();                  // this is necessary
  lcd.backlight();
  lcd.print("ArduinoALL");
}
void loop(){}
3. ต่อวงจรตามนี้ ก็จะพบว่าสามารถแสดงผลออกทางจอ LCD ผ่านทางอุปกรณ์ I2C ได้แล้ว
  •     ATtiny85 Pin4 –> Ground
  •     ATtiny85 Pin5 –> LCD Sda
  •     ATtiny85 Pin7 –> LCD Scl
  •     ATtiny85 Pin8 –> +5V



อ้างอิง

www.arduinoall.com

วันเสาร์ที่ 17 ธันวาคม พ.ศ. 2559

Fan Module for Arduino (Keyes L9110)


Fan Module for Arduino (Keyes L9110)


    โมดูลพัดลมที่ทาง Arduitronics.com เอามาจำหน่ายตัวนี้เหมาะสำหรับการทดลองศึกษาเรื่องการใช้งาน DC motor นะครับ  สามารถควบคุมความเร็ว และทิศทางการหมุนได้จาก Sketch ที่เขียนใน Arduino ครับ

Specification

  • ขนาดของบอร์ด  50x26x15 mm
  • ขนาดใบพัด 75 mm
  • แรงดันทำงาน 5 โวลต์
  • ใช้ IC L9110 เป็นตัวขับมอเตอร์

Specifications
  • Product size: 50*26*15mm (not including the propeller)
  • The propeller diameter: 75mm
  • Working voltage: 5V
// wired connections
#define HG7881_B_IA 10 // D10 --> Motor B Input A --> MOTOR B +
#define HG7881_B_IB 11 // D11 --> Motor B Input B --> MOTOR B -

// functional connections
#define MOTOR_B_PWM HG7881_B_IA // Motor B PWM Speed
#define MOTOR_B_DIR HG7881_B_IB // Motor B Direction

// the actual values for "fast" and "slow" depend on the motor
#define PWM_SLOW 50  // arbitrary slow speed PWM duty cycle
#define PWM_FAST 200 // arbitrary fast speed PWM duty cycle
#define DIR_DELAY 1000 // brief delay for abrupt motor changes

void setup()
{
  Serial.begin( 9600 );
  pinMode( MOTOR_B_DIR, OUTPUT );
  pinMode( MOTOR_B_PWM, OUTPUT );
  digitalWrite( MOTOR_B_DIR, LOW );
  digitalWrite( MOTOR_B_PWM, LOW );
}

void loop()
{
  boolean isValidInput;
  // draw a menu on the serial port
  Serial.println( "-----------------------------" );
  Serial.println( "MENU:" );
  Serial.println( "1) Fast forward" );
  Serial.println( "2) Forward" );
  Serial.println( "3) Soft stop (coast)" );
  Serial.println( "4) Reverse" );
  Serial.println( "5) Fast reverse" );
  Serial.println( "6) Hard stop (brake)" );
  Serial.println( "-----------------------------" );
  do
  {
    byte c;
    // get the next character from the serial port
    Serial.print( "?" );
    while( !Serial.available() )
      ; // LOOP...
    c = Serial.read();
    // execute the menu option based on the character recieved
    switch( c )
    {
      case '1': // 1) Fast forward
        Serial.println( "Fast forward..." );
        // always stop motors briefly before abrupt changes
        digitalWrite( MOTOR_B_DIR, LOW );
        digitalWrite( MOTOR_B_PWM, LOW );
        delay( DIR_DELAY );
        // set the motor speed and direction
        digitalWrite( MOTOR_B_DIR, HIGH ); // direction = forward
        analogWrite( MOTOR_B_PWM, 255-PWM_FAST ); // PWM speed = fast
        isValidInput = true;
        break;      
         
      case '2': // 2) Forward      
        Serial.println( "Forward..." );
        // always stop motors briefly before abrupt changes
        digitalWrite( MOTOR_B_DIR, LOW );
        digitalWrite( MOTOR_B_PWM, LOW );
        delay( DIR_DELAY );
        // set the motor speed and direction
        digitalWrite( MOTOR_B_DIR, HIGH ); // direction = forward
        analogWrite( MOTOR_B_PWM, 255-PWM_SLOW ); // PWM speed = slow
        isValidInput = true;
        break;      
         
      case '3': // 3) Soft stop (preferred)
        Serial.println( "Soft stop (coast)..." );
        digitalWrite( MOTOR_B_DIR, LOW );
        digitalWrite( MOTOR_B_PWM, LOW );
        isValidInput = true;
        break;      

      case '4': // 4) Reverse
        Serial.println( "Fast forward..." );
        // always stop motors briefly before abrupt changes
        digitalWrite( MOTOR_B_DIR, LOW );
        digitalWrite( MOTOR_B_PWM, LOW );
        delay( DIR_DELAY );
        // set the motor speed and direction
        digitalWrite( MOTOR_B_DIR, LOW ); // direction = reverse
        analogWrite( MOTOR_B_PWM, PWM_SLOW ); // PWM speed = slow
        isValidInput = true;
        break;      
         
      case '5': // 5) Fast reverse
        Serial.println( "Fast forward..." );
        // always stop motors briefly before abrupt changes
        digitalWrite( MOTOR_B_DIR, LOW );
        digitalWrite( MOTOR_B_PWM, LOW );
        delay( DIR_DELAY );
        // set the motor speed and direction
        digitalWrite( MOTOR_B_DIR, LOW ); // direction = reverse      
        analogWrite( MOTOR_B_PWM, PWM_FAST ); // PWM speed = fast
        isValidInput = true;
        break;
         
      case '6': // 6) Hard stop (use with caution)
        Serial.println( "Hard stop (brake)..." );
        digitalWrite( MOTOR_B_DIR, HIGH );
        digitalWrite( MOTOR_B_PWM, HIGH );
        isValidInput = true;
        break;      
         
      default:
        // wrong character! display the menu again!
        isValidInput = false;
        break;
    }
  } while( isValidInput == true );

  // repeat the main loop and redraw the menu...
}

 

อ้างอิง

https://www.arduitronics.com/product/403/fan-module-for-arduino-keyes-l9110