วันศุกร์ที่ 27 มกราคม พ.ศ. 2560

801S Vibration Sensor vibration module โมดูลตรวจจับความสันไหวปรับความไวได้

801S Vibration Sensor vibration module โมดูลตรวจจับความสันไหวปรับความไวได้

Vibration Sensor Module ใช้เซนเซอร์เบอร์ 801S ในการตรวจจับความเคลื่อนไหว

คุณภาพสูง ใช้ไฟเลี้ยง3-5V

สามารถปรับความไวได้ ให้สัญญาณanalog และ digital ใช้กับงานตรวจจับ เช่น อุปกร์ป้องกันขโมย,บอร์ดล็อกแบบอิเล็กทรอนิกส์ 
,อุปกรณ์ตรจจับความสั่นไหว





ตัวอย่างการใช้งาน

เซนเซอร์ -> Arduino

+5V -> 5V

Gnd -> Gnd

Output -> A0

 ตัวอย่าง Code

void setup() {

  // initialize serial communication at 9600 bits per second:

  Serial.begin(9600);

}

// the loop routine runs over and over again forever:

void loop() {

  // read the input on analog pin 0:

  int sensorValue = analogRead(A0);

  // print out the value you read:

  Serial.println(sensorValue);

  delay(1000);        // delay in between reads for stability

}

 ตัวอย่าง VDO

https://www.youtube.com/watch?v=7FkL_tyRbQA


อ้างอิง

www.myarduino.net/product/34/801s-vibration-sensor-vibration-module-โมดูลตรวจจับความสันไหวปรับความไวได้

วันพฤหัสบดีที่ 19 มกราคม พ.ศ. 2560

โมดูลสื่อสารไร้สายระยะสั้น

PN532 NFC RFID V3



รายละเอียด
 PN532 NFC RFID Module เป็นโมดูลสื่อสารไร้สายระยะสั้นระยะประมาณ 4 ซม. ที่ใช้ได้ดีกับโครงสร้างพื้นฐานแบบไร้สัมผัส ช่วยสนับสนุนรองรับการสื่อสารระหว่างเครื่องมืออิเล็กทรอนิกส์ในระยะใกล้ๆ รองรับการใช้งานแบบ II2, SPI และ HSU (High Speed UART) ใช้ไฟเลี้ยง 5V 


ประกอบด้วย
Items Quantity
PN532 NFC RFID Module 1
2.54 mm spacing 4pin Cable 1
Mifare One S50 White Card 1
Mifare One S50 Key Card 1
12P bended male pins


การต่อวงจร
Vcc - > 3.3 / 5 V
Gnd -> Gnd
SCL -> A5
SDA -> A4


โค้ดตัวอย่างการใช้งาน

#include

#include <PN532_I2C.h>

#include

PN532_I2C pn532i2c(Wire);

PN532 nfc(pn532i2c);

void setup(void)

{

  Serial.begin(115200);

  Serial.println("Hello!");

  nfc.begin();

  uint32_t versiondata = nfc.getFirmwareVersion();

  if (! versiondata)

 {

    Serial.print("Didn't find PN53x board");

    while (1); // halt

  }

  

  // Got ok data, print it out!

  Serial.print("Found chip PN5"); Serial.println((versiondata>>24) & 0xFF, HEX); 

  Serial.print("Firmware ver. "); Serial.print((versiondata>>16) & 0xFF, DEC); 

  Serial.print('.'); Serial.println((versiondata>>8) & 0xFF, DEC);

  

  // Set the max number of retry attempts to read from a card

  // This prevents us from waiting forever for a card, which is

  // the default behaviour of the PN532.

  nfc.setPassiveActivationRetries(0xFF);

  // configure board to read RFID tags

  nfc.SAMConfig();

  Serial.println("Waiting for an ISO14443A card");

}


void loop(void)

{

  boolean success;

  uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 };  // Buffer to store the returned UID

  uint8_t uidLength;                        // Length of the UID (4 or 7 bytes depending on ISO14443A card type)

  

  // Wait for an ISO14443A type cards (Mifare, etc.).  When one is found

  // 'uid' will be populated with the UID, and uidLength will indicate

  // if the uid is 4 bytes (Mifare Classic) or 7 bytes (Mifare Ultralight)

  success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, &uid[0], &uidLength);

  

  if (success)

    {

    Serial.println("Found a card!");

    Serial.print("UID Length: ");Serial.print(uidLength, DEC);Serial.println(" bytes");

    Serial.print("UID Value: ");

    for (uint8_t i=0; i < uidLength; i++) 

    {

      Serial.print(" 0x");Serial.print(uid[i], HEX); 

    }

    Serial.println("");

    // Wait 1 second before continuing

    delay(1000);

  }

  else

  {

    // PN532 probably timed out waiting for a card

    Serial.println("Timed out waiting for a card");

  }

}

หน้าจอแสดงผลขณะยังไม่แตะ PN532 NFC RFID 


หน้าจอแสดงผลขณะแตะ PN532 NFC RFID 


อ้างอิง

 https://www.arduinoall.com/product/146/rfid-nfc-module-kit-pn532-พร้อมแท็ก-2-ชิ้น-card-พวงกุญแจ

วันเสาร์ที่ 14 มกราคม พ.ศ. 2560

JoyStick Shield expansion board for arduino

JoyStick Shield expansion board for arduino

     จอยสติกสำหรับ Arduino แค่เสียบลงไป ก็สมารถใช้ Arduino ควบคุมเป็นแบบ JoyStick ได้แล้ว  ใช้งานง่ายเหมือนเป็นสวิตช์ทั่ว ๆ ไป พร้อมช่องรองรับการเชื่อมต่อแบบไร้สาย NRF24L01 และจอแสดงผล Nokia 5110 LCD

รายละเอียด JoyStick Shield expansion board for arduino

  Add nRF24L01 RF interface
  Add Nokia 5110 LCD interface, so very easy to game development.
  Adding a Bluetooth module interface, convenient Bluetooth wireless serial communication.
  Add I2C communication interface, easy connectivity to I2C devices
  Meanwhile, JoyStick Shield with a cross PS2 joystick with buttons, there are four round buttons, 2     small buttons.
  Provides for the Arduino joystick and buttons input expansion. Onboard switches can switch          b   between 3.3V and 5V, can use this model for other 3.3V microcontroller platforms, such as STM32.

  Map ขา nRF24L01

   MOSI = D11
   CSN = D10
   VCC = 3V
   MISO = D12
   SCK = D13
   CE = D9

ตัวอย่างโคด Arduino JoyStick Shield expansion board for arduino

const byte PIN_ANALOG_X = 0;
const byte PIN_ANALOG_Y = 1;
const byte PIN_A = 2;
const byte PIN_B = 3;
const byte PIN_C = 4;
const byte PIN_D = 5;
const byte PIN_E = 6;
const byte PIN_F = 7;
const byte PIN_K = 8;


void setup() {
  Serial.begin(9600);

  pinMode(PIN_A, INPUT);
  digitalWrite(PIN_A, HIGH);

  pinMode(PIN_B, INPUT);
  digitalWrite(PIN_B, HIGH);

  pinMode(PIN_C, INPUT);
  digitalWrite(PIN_C, HIGH);

  pinMode(PIN_D, INPUT);
  digitalWrite(PIN_D, HIGH);

  pinMode(PIN_E, INPUT);
  digitalWrite(PIN_E, HIGH);
  
  pinMode(PIN_F, INPUT);
  digitalWrite(PIN_F, HIGH);
  
  pinMode(PIN_K, INPUT);
  digitalWrite(PIN_K, HIGH);
}

void loop() {
  Serial.print("x:");
  Serial.print(analogRead(PIN_ANALOG_X));
  Serial.print(" ");

  Serial.print("y:");
  Serial.print(analogRead(PIN_ANALOG_Y));
  Serial.print(" ");
  
  Serial.print("A:");
  Serial.print(digitalRead(PIN_A));
  Serial.print(" ");

  Serial.print("B:");
  Serial.print(digitalRead(PIN_B));
  Serial.print(" ");

  Serial.print("C:");
  Serial.print(digitalRead(PIN_C));
  Serial.print(" ");

  Serial.print("D:");
  Serial.print(digitalRead(PIN_D));
  Serial.print(" ");

  Serial.print("E:");
  Serial.print(digitalRead(PIN_E));
  Serial.print(" ");
  
  Serial.print("F:");
  Serial.print(digitalRead(PIN_F));
  Serial.print(" ");
  
  Serial.print("K:");
  Serial.print(digitalRead(PIN_K));
  Serial.print(" ");


  Serial.println();
}

วีดีโอตัวอย่าง Arduino JoyStick Shield expansion board for arduino

   https://www.youtube.com/watch?v=wJXgECta8oc




วันอังคารที่ 3 มกราคม พ.ศ. 2560

GP2Y0A02 Infrared Sensor Sharp GP2Y0A02 Distance Sensor 20cm - 150cm

เซนเซอร์วัดระยะทางเป็นเส้นตรงด้วยอินฟาเรด ระยะทางแม่นยำ 20 - 150 เซนติเมตร

รายละเอียด Distance Measuring Sensor 20-150cm (SHARP GP2Y0A02)

Technical / Catalog Information GP2Y0A02
Classification Sensors, Transducers
Analog output type
Range 20cm ~ 150cm
Supply voltage 4.5V ~ 5.5V
Current - 33mA power
Voltage - Output (standard value) @ a distance under the conditions of 400mV @ 150cm
Voltage - difference (standard value) 2.05V @ 20 ~ 150cm
 
ตัวอย่างโคด Arduino Distance Measuring Sensor 20-150cm (SHARP GP2Y0A02)

int IRpin = A0;                               // ต่อเซนเซอร์กับขา A0

void setup() {
   
  Serial.begin(9600);                             
}

void loop() {
  float volts = analogRead(IRpin)*0.0048828125;   // value from sensor * (5/1024) - if running 3.3.volts then change 5 to 3.3
  float distance = 65*pow(volts, -1.10);         
  Serial.println(distance);                      
  delay(100);                                     
}



วันจันทร์ที่ 26 ธันวาคม พ.ศ. 2559

Counter / Speed Sensor ร่วมกับ 7 Segment Display

การใช้งาน Counter / Speed Sensor ร่วมกับ 7 Segment Display




บทความนี้เป็นภาคต่อของบทความ สร้างนาฬิกาดิจิตอลด้วยบอร์ด Arduino ที่เป็นการนำ 7 Segment Display มาใช้แสดงผลร่วมกับเซ็นเซอร์ต่างๆ ในบทความนี้เป็นการนำมาต่อใช้งานร่วมกับโมดูล Counter / Speed Sensor เพื่อนับจำนวนเหรียญ สามารถนำไปประยุกต์ใช้ทำเครื่องนับจำนวนเหรียญ หรือกระปุกออมสินได้ครับ


การใช้งาน Counter / Speed Sensor
ตัวโมดูลเซ็นเซอร์จะมีขาให้ใช้งานทั้งหมด 4 ขา มี 2 ขาสำหรับจ่ายไฟ และอีก 2 ขา สำหรับส่งสัญญาณออกมาเมื่อตรวจพบวัตถุ

ขา VCC สำหรับต่อไฟบวก 3.3 - 5V
ขา GND
ขา D0 เป็นขาส่งสัญญาณ HIGH (ลอจิก 1) ออกมา เมื่อตรวจพบวัตถุ
ขา A0 เป็นขาสำหรับปล่อยสัญญาณแบบอนาล็อกออกมา ขานี้จะถูกใช้งานเมื่อวัตถุมีลักษณะโปร่งแสง ทำให้ต้องอ่านค่าอย่างละเอียดจาดตัวเซ็นเซอร์



การใช้งานจะเหมือนกับการอ่านค่าสวิตซ์ คือใช้คำสั่ง pinMode(... , INPUT); และคำสั่ง digitalRead(...); อ่านค่าออกมา

การใช้งานโมดูล 7 Segment Display
ที่จริงแล้วโมดูลนี้เหมาะสำหรับนำไปทำเป็นนาฬิกามากกว่า หรืองานที่เกี่ยวกับการแสดงผลเวลา แต่หากปิดการใช้งานโคล่อน ( : ) ไว้ ก็สามารถนำมาใช้งานแสดงผลตัวเลข 4 หลักได้



โมดูลแสดงผลนี้ใช้ไอซี TM1637 ในการขับ 7 Segment Display ดังนั้นจึงต้องไปโหลดไลบารี่มาลงก่อน สามารถดาว์โหลดได้ที่ : TM1637 (By IOXhop.com)

ขาของโมดูลจะมีทั้งหมด 4 ขา ดังนี้

VCC สำหรับจ่ายไฟแรงดัน 3.3V - 5V
GND
CLK สำหรับสร้างความถี่กำหนดจังหวะการส่งข้อมูล
DIO สำหรับส่งข้อมูล



สำหรับคำสั่งที่ใช้ ทาง IOXhop ได้สร้างฟังก์ชั่น .print() ไว้ให้ใช้งานแล้ว นำตัวเลขไปใส่โมดูลก็จะแสดงผลตัวเลขออกมาเลย

วงจร
วงจรสามารถเปลี่ยนแปลงได้ หากต่อขาของโมดูลเข้ากับขาอื่นๆของบอร์ด Arduino ดังนั้นหากเปลี่ยนขา ต้องแก้โค้ดด้วย

สำหรับการต่อขาใช้งานตามโค้ด จะกำหนดไว้ดังนี้

ต่อขา VCC ของทั้ง 2 โมดูล เข้ากับขา 5V
ต่อขา GND ของทั้ง 2 โมดูล เข้ากับขา GND
ต่อขา CLK ของโมดูล 7 Segment Display เข้ากับขา D3 ของบอร์ด Arduino
ต่อขา DIO ของโมดูล 7 Segment Display เข้ากับขา D2 ของบอร์ด Arduino
ต่อขา D0 ของโมดูล Counter / Speed Sensor เข้ากับขา D4 ของบอร์ด Arduino

โค้ด

// CounterSensorDisplay by IOXhop.com

#include <TM1637Display.h>

// Module connection pins (Digital Pins)
#define CLK 3 // กำหนดว่าขา CLK ต่ออยู่กับขา D3
#define DIO 2 // กำหนดว่าขา DIO ต่ออยุ่กับขา D2
#define D0Sensor 4 // กำหนดว่าขา D0 ของ Counter / Speed Sensor ต่ออยู่กับขา D4

TM1637Display display(CLK, DIO); // เริ่มใช้งานไลบารี่

int i; // ประกาศตัวแปร i เป็นชนิด int เก็บข้อมูลตัวเลขจำนวนเต็ม

void setup()
{
  pinMode(D0Sensor, INPUT); // กำหนดให้ขาที่ต่อกับ D0 ของเซ็นเซอร์เป็นขาอินพุต
}

void loop()
{
  if (digitalRead(D0Sensor)==HIGH) { // ถ้าขาที่ต่อกับ D0 มีสถานะเป็น HIGH
    while(digitalRead(D0Sensor)==HIGH); // ให้รอจนกว่าขาที่ต่อกับ D0 เป็น LOW
    i++; // เพิ่มค่าในตัวแปร i ขึ้น 1 จำนวน
  }
  display.print(i); // แสดงผลค่า i ออกทางหน้าจอ 7 Segment
  delay(10); // หน่วงเวลา 10mS
}

การใช้งาน
เมื่อนำเหรียญไปบังในร่องของเซ็นเซอร์ แล้วนำออกมา จะทำให้ตัวเลขเพิ่มขึ้นมาทีละ 1 กรณีที่มีเหรียญบังค้างไว้ จะไม่เริ่มนับต่อจนกว่าเหรียญจะออกไปจากร่องแล้ว

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

1602 LCD (Blue Screen) 16x2 LCD with backlight of the LCD screen

1602 LCD (Blue Screen) LCD with backlight of the LCD screen

หน้าจอแสดงผล LCD ไฟแบคไลท์สีน้ำเงิน ขนาด 16 ตัวอักษร 2 บรรทัด มีไลบารีมาตรฐานพร้อมใช้งาน

แนะนำให้ใช้กับตัว I2C Module นี้นะครับ ช่วยลดขาในการต่อ

 นิยมใช้ร่วมกับ

2.54mm 1X16 16Pin Gold-plated Single Row Straight Female Pin Header
1602 2004 LCD Adapter Plate IIC I2C Interface for arduino
ฟังก์ชั่นสั่งงานจอ LCD
lcd.begin(จำนวนตัวอักษรที่ใส่ได้ในแถว,จำนวนแถวทั้งหมด)

> ใช้กำหนดลักษณะหน้าจอ เช่น ถ้าจอเรามี 2แถว 16ตัวอักษร ให้ใส่ lcd.begin(16,2);

lcd.clear()

> ใช้ล้างหน้าจอ เมื่อมีตัวอักษรใดๆอยู่บนหน้าจอ จะถูกล้างออกทั้งหมด

lcd.home()

> ใช้ปรับให้เคเซอร์กลับไปอยู่ที่ตำแหน่งแรกด้านซ้าย เมื่อใช้คำสั่ง lcd.print() จะไปเริ่มแสดงผลทางด้านบนซ้าย

lcd.setCursor(ลำดับตัวอักษรนับจากทางซ้าย, บรรทัด)

> ใช้ตั้งค่าเคเซอร์ เช่น lcd.setCursor(2, 0); หมายถึงเซ็ตเคเซอร์ไปตัวอักษรที่ 2 นับจากทางซ้าย และอยู่บรรทัดแรก เมื่อใช้คำสั่ง lcd.print() ตัวอักษรตัวแรกจะอยู่ลำดับที่ 3 นับจากทางซ้าย

lcd.write(ข้อมูลที่ต้องการเขียนออกไป)

> ใช้สำหรับเขียนข้อมูลออกไปทีละตัวอักษร

lcd.print(ข้อมูลที่ต้องการให้เขียนออกไป [, รูปแบบข้อมูล])

> ใช้เขียนข้อมูลออกไปทั้งข้อความ

lcd.cursor()

> ใช้สั่งให้แสดงเคเซอร์บนหน้าจอ

lcd.noCursor()

> ใช้สั่งให้ไม่แสดงเคเซอร์บนหน้าจอ

lcd.display()

> แสดงตัวอักษรบนหน้าจอ

lcd.noDisplay()

> ปิดการแสดงตัวอักษรในหน้าจอ

lcd.scrollDisplayLeft()

> เลือนตัวอักษรไปทางซ้าย 1 ตัว

lcd.scrollDisplayRight()

> เลื่อนตัวอักษรไปทางขวา 1 ตัว

lcd.autoscroll()

> เลื่อนตัวอักษรไปทางขวาอัตโนมัติหากใช้คำสั่ง lcd.print() หรือ lcd.write() เมื่อตัวอักษรเต็มหน้าจอ

lcd.noAutoscroll()

> ปิดการเลื่อนตัวอักษรอัตโนมัติ

lcd.leftToRight()

> เมื่อใช้คำสั่ง lcd.print() หรือ lcd.write() ตัวอักษรจะเขียนจากซ้ายไปขวา

lcd.rightToLeft()

> เมื่อใช้คำสั่ง lcd.print() หรือ lcd.write() ตัวอักษรจะเขียนจากขวาไปซ้าย





ตัวอย่างโค๊ด 

#include <LiquidCrystal.h>// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12,11,5,4,3,2);
void setup(){// set up the LCD's number of columns and rows:
lcd.begin(16,2);// Print a message to the LCD.
lcd.print("hello, world!");
}
void loop(){// set the cursor to column 0, line 1// (note: line 1 is the second row, since counting begins with0 ):
lcd.setCursor(0,1);// print the number of seconds since reset:
lcd.print(millis()/1000);
}

อ้างอิง

http://www.myarduino.net/product/19/1602-lcd-blue-screen-16x2-lcd-with-backlight-of-the-lcd-screen

วันพฤหัสบดีที่ 24 พฤศจิกายน พ.ศ. 2559

Fan Module for Arduino

Fan Module for Arduino

Specification

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

// 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