Elektrik elektronik temrinleri

Ders Notlarý => Arduino Öðreniyorum => Çocuklar için => Konuyu balatan: Hasan ERTÜRK - 22 Nisan 2018, 17:45:56

Balk: 1. Kod yazmadan arduino programlayýn
Gnderen: Hasan ERTÜRK - 22 Nisan 2018, 17:45:56
Herhangi bir programlama dili bilmeden tamamen görsel olarak Arduino programlayabilirsiniz. programlamaya baþlamadan önce bir ön hazýrlýðýmýz olacak. Aþaðýdaki açýklamalarý takip ederek ön bilgilenmeyi tamamladýktan sonra kod yazmadan arduino programlamaya baþlayabilirsiniz.

Scracth Nedir?

Scratch yazýlým geliþtirme platformu ve programlama dili çocuklarýn bilgisayar programlamaya ilk adýmlarý atmalarýný saðlamak amacýyla geliþtirilmiþtir.

(http://temrinlerim.org/images/scratch.gif)

S4A Nedir?
S4A programý Scratch tabanlý bir programlama dilidir. Ýçerisinde Arduino’yu kontrol etmemizi saðlayan bazý programlama bloklarý bulunur. Bu program bloklarý sayesinde kod yazmadan tamamen görsel olarak Arduino’yu programlayabilirsiniz. Programýnýzý bloklar halinde yazýyor olmanýz dýþýnda S4A’nýn Türkçe dil desteðinin olmasý programlamaya ayrý bir kolaylýk getiriyor.

Programýn avantajlarýndan birisi ise yalnýzca bilgisayardan veri gönderme deðil ayný zamanda Arduino’dan gelen verileri de okuyabiliyorsunuz. Bu sayede daha zengin programlar yazabilirsiniz.

(http://temrinlerim.org/images/s4a.png)

Öncelikle buraya týklayarak (https://www.arduino.cc/en/Main/Software) Arduino’nun yazýlýmýný indirmelisiniz.

Ardýndan aþaðýdaki kodlarý bir defaya mahsus arduinoya yüklemeniz gerekiyor.

Kod: [Se]
typedef enum {
  input, servomotor, pwm, digital }
pinType;

typedef struct pin {
  pinType type;       //Type of pin
  int state;         //State of an output
  //byte value;       //Value of an input. Not used by now. TODO
};

pin arduinoPins[14];  //Array of struct holding 0-13 pins information

unsigned long lastDataReceivedTime = millis();

void setup()
{
  Serial.begin(38400);
  Serial.flush();
  configurePins();
  resetPins();
}

void loop()
{
  static unsigned long timerCheckUpdate = millis();

  if (millis()-timerCheckUpdate>=20)
  {
    sendUpdateServomotors();
    sendSensorValues();
    timerCheckUpdate=millis();
  }

  readSerialPort();
}

void configurePins()
{
  arduinoPins[0].type=input;
  arduinoPins[1].type=input;
  arduinoPins[2].type=input;
  arduinoPins[3].type=input;
  arduinoPins[4].type=servomotor;
  arduinoPins[5].type=pwm;
  arduinoPins[6].type=pwm;
  arduinoPins[7].type=servomotor;
  arduinoPins[8].type=servomotor;
  arduinoPins[9].type=pwm;
  arduinoPins[10].type=digital;
  arduinoPins[11].type=digital;
  arduinoPins[12].type=digital;
  arduinoPins[13].type=digital;
}

void resetPins() {
  for (byte index=0; index <=13; index++)
  {
    if (arduinoPins[index].type!=input)
    {
      pinMode(index, OUTPUT);
      if (arduinoPins[index].type==servomotor)
      {
        arduinoPins[index].state = 255;
        servo (index, 255);
      }
      else
      {
        arduinoPins[index].state=0;
        digitalWrite(index,LOW);
      }
    }
  }
}

void sendSensorValues()
{
  unsigned int sensorValues[6], readings[5];
  byte sensorIndex;

  for (sensorIndex = 0; sensorIndex < 6; sensorIndex++) //for analog sensors, calculate the median of 5 sensor readings in order to avoid variability and power surges
  {
    for (byte p = 0; p < 5; p++)
      readings[p] = analogRead(sensorIndex);
    insertionSort(readings, 5); //sort readings
    sensorValues[sensorIndex] = readings[2]; //select median reading
  }

  //send analog sensor values
  for (sensorIndex = 0; sensorIndex < 6; sensorIndex++)
    ScratchBoardSensorReport(sensorIndex, sensorValues[sensorIndex]);

  //send digital sensor values
  ScratchBoardSensorReport(6, digitalRead(2)?1023:0);
  ScratchBoardSensorReport(7, digitalRead(3)?1023:0);
}

void insertionSort(unsigned int* array, unsigned int n)
{
  for (int i = 1; i < n; i++)
    for (int j = i; (j > 0) && ( array[j] < array[j-1] ); j--)
      swap( array, j, j-1 );
}

void swap(unsigned int* array, unsigned int a, unsigned int b)
{
  unsigned int temp = array[a];
  array[a] = array[b];
  array[b] = temp;
}

void ScratchBoardSensorReport(byte sensor, int value) //PicoBoard protocol, 2 bytes per sensor
{
  Serial.write( B10000000
    | ((sensor & B1111)<<3)
    | ((value>>7) & B111));
  Serial.write( value & B1111111);
}

void readSerialPort()
{
  byte pin;
  int newVal;
  static byte actuatorHighByte, actuatorLowByte;
  static byte readingSM = 0;

  if (Serial.available())
  {
    if (readingSM == 0)
    {
      actuatorHighByte = Serial.read();
      if (actuatorHighByte >= 128) readingSM = 1;
    }
    else if (readingSM == 1)
    {
      actuatorLowByte = Serial.read();
      if (actuatorLowByte < 128) readingSM = 2;
      else readingSM = 0;
    }

    if (readingSM == 2)
    {
      lastDataReceivedTime = millis();   
      pin = ((actuatorHighByte >> 3) & 0x0F);
      newVal = ((actuatorHighByte & 0x07) << 7) | (actuatorLowByte & 0x7F);

      if(arduinoPins[pin].state != newVal)
      {
        arduinoPins[pin].state = newVal;
        updateActuator(pin);
      }
      readingSM = 0;
    }
  }
  else checkScratchDisconnection();
}

void reset() //with xbee module, we need to simulate the setup execution that occurs when a usb connection is opened or closed without this module
{
  resetPins();        // reset pins
  sendSensorValues(); // protocol handshaking
  lastDataReceivedTime = millis();
}

void updateActuator(byte pinNumber)
{
  if (arduinoPins[pinNumber].type==digital) digitalWrite(pinNumber, arduinoPins[pinNumber].state);
  else if (arduinoPins[pinNumber].type==pwm) analogWrite(pinNumber, arduinoPins[pinNumber].state);
}

void sendUpdateServomotors()
{
  for (byte p = 0; p < 10; p++)
    if (arduinoPins[p].type == servomotor) servo(p, arduinoPins[p].state);
}

void servo (byte pinNumber, byte angle)
{
  if (angle != 255)
    pulse(pinNumber, (angle * 10) + 600);
}

void pulse (byte pinNumber, unsigned int pulseWidth)
{
  digitalWrite(pinNumber, HIGH);
  delayMicroseconds(pulseWidth);
  digitalWrite(pinNumber, LOW);
}

void checkScratchDisconnection() //the reset is necessary when using an wireless arduino board (because we need to ensure that arduino isn't waiting the actuators state from Scratch) or when scratch isn't sending information (because is how serial port close is detected)
{
  if (millis() - lastDataReceivedTime > 1000) reset(); //reset state if actuators reception timeout = one second
}



Bu sayede S4A programý ile Arduino arasýnda ilk haberleþmeyi saðlayacaksýnýz. S4A programýnýn Arduino’nuzu tanýmasý için S4AFirmware16 isimli programý Arduino’ya atmanýz gerekiyor. Sonrasýnda bu iþlemi tekrarlamanýza gerek yok.

S4A’yý buraya týklayarak (http://s4a.cat/) indirebilirsiniz. S4A programýnýn kurduktan sonra aþaðýda ki görüntü ile karþýlaþacaksýnýz.

(http://temrinlerim.org/images/s4a2.png)

Sol tarafta ki program bloklarýný kullanarak programýnýzý oluþturabilir ve Arduino’da çalýþmasýný saðlayabilirsiniz. S4A ile programlamaya hemen baþlayýn !