Get it on Google Play


Wm뮤 :: '아두이노' 카테고리의 글 목록 (2 Page)

블로그 이미지
가끔 그림그리거나 3D모델링하거나
취미로 로봇만드는
전자과 게임프로그래머 (퇴사함)
2022.3.22f1 주로 사용
모카쨩
@Ahzkwid

Recent Comment

Archive


2021. 7. 15. 00:21 아두이노

 

 

본문코드

#include "HeaderTest.h"
void setup() {
  WireBegin();
  Serial.begin(9600);
}

void loop() {
    Serial.println("t:"+String( ReturnTwo()));
  delay(1000);
}

 

 

헤더코드

//HeaderTest.h
#include<Wire.h>

long _time = millis();
long _time_save = _time;

void WireBegin()
{
  Wire.begin();      
}
int ReturnTwo()
{
  return 2;
}

'아두이노' 카테고리의 다른 글

아두이노 LCD 1602  (0) 2021.07.16
자주쓰는 아두이노 코드 모음  (0) 2021.06.21
byte to hex  (0) 2021.02.23
posted by 모카쨩
2021. 6. 21. 18:39 아두이노

 

 

 

문자열 처리

int StringToHex(char str[])
{
  return (int) strtol(str, 0, 16);
}
int StringToHex(String text)
{
  return (int) strtol(text.c_str(), 0, 16);
}
void StringToHexArray(byte *byteArray,String text)
{
  for(int i=0;i<text.length();i++)
  {
    byteArray[i]=StringToHex(text.substring(i*2,i*2+2));
  }
  
}

String IntToHexString(int hexInt)
{
   return String("0123456789ABCDEF"[hexInt/16])+String("0123456789ABCDEF"[hexInt%16]);
}

 

문자열 연산

//정적 문자열+정적 문자열
String text=String("text1")+String("text2");

//문자열+숫자
String text=String("text1")+number;

//문자열+캐릭터
String text=String("text1")+char;

 

 

 

enum (개구림)

//선언부
enum State {
  Start, //다른 Enum인자명, 함수명과 동일하면 안된다
  NonPlaying,
  Playing
};

State state=Start;

//switch
  String Message="Unknown";
  switch(state)
  {
    case Start:
      Message="Start";
      break;
    case NonPlaying:
      Message="NonPlaying";
      break;
  }



//enum연산
state=(State)((int)state+1);

enum 길이

슬프게도 이것보다 더 좋은 방법을 찾을수 없었다

enum State {
  Start,
  NonPlaying,
  Playing,
  Count
};

int _max=Count;

 

 

 

 

enum class 

이름 충돌 방지한답시고 더 귀찮게 만들어놨다.

유지보수하는놈은 지능 덜 떨어진게 분명함. C#좀 보고 배워야 한다

//선언부
enum class State {
  Start,
  NonPlaying,
  Playing
};

State state=State::Start;

//switch
  String Message="Unknown";
  switch(state)
  {
    case State::Start:
      Message="Start";
      break;
    case State::NonPlaying:
      Message="NonPlaying";
      break;
  }



//enum연산
state=(State)((int)state+1);

 

enum class 길이

enum class State {
  Start,
  NonPlaying,
  Playing,
  Count
};

int _max=(int)State::Count;



//연산에 적용

    state=(State)((int)state-1);
    if((int)state<0)
    {
      state=(State)((int)State::Count-1);
    }
    
    
    
    state=(State)((int)state+1);
    if(state>=State::Count)
    {
      state=(State)0;
    }

 

 

 

 

 

비프, 부저 (패시브)

void HandmadeTone(int pin,int frequency,int duration) 
{

#if defined(ARDUINO_AVR_UNO)
    tone(pin, frequency, duration);
#else
  bool pinState=HIGH;
  int delayTime=(1000*1000)/(frequency*4);

  for(int i=0;i<(duration*1000)/delayTime;i++)
  {
    pinState=!pinState;
    digitalWrite(pin, pinState);
    delayMicroseconds(delayTime);
  }
  digitalWrite(pin, LOW);
#endif
}
void Beef() 
{
    int pin=4;
    int frequency=768;
    int duration=100;
    HandmadeTone(pin, frequency, duration);
}

void BeefError() 
{
    int pin=4;
    int frequency=768*0.25;
    int duration=100;
    HandmadeTone(pin, frequency, duration);
    delay(100);
    HandmadeTone(pin, frequency, duration);
}

 

 

버튼

내부적으로 저항이 생기기 때문에 별도 저항연결이 필요없다

int pinButton=2;
void setup() 
{
  pinMode(pinButton, INPUT_PULLUP); 
}
void loop() 
{

  
  if(!digitalRead(pinButton))
  {
    //실행코드
    while(!digitalRead(pinButton))
    {
      delay(10);
    }
  }
}

 

 

델타타임

unsigned long currentTime=0;
unsigned long currentTimePrevious=0;
float deltaTime=0.01;
void SetDeltaTime() 
{
  currentTime=millis();
  float deltaTimeTemp=((float)(currentTime-currentTimePrevious))/1000;
  currentTimePrevious=currentTime;
  if(deltaTimeTemp>0)
  {
    deltaTime=deltaTimeTemp;
  }
}




void loop() 
{

  SetDeltaTime() ;
  Serial.println(String(deltaTime));
}

 

 

 

 

 

 

 

 

 

조이스틱

  int xVal=analogRead(A0);
  if(xVal<128)
  {
    //Left
    delay(400);
  }
  if(xVal>1024-128)
  {
    //Right
    delay(400);
  }
  
  int yVal=analogRead(A1);
  if(yVal<128)
  {
    //Up
    delay(400);
  }
  if(yVal>1024-128)
  {
    //Down
    delay(400);
  }

개빡치게 중앙값이 750~800이고 조금만 움직여도 맥스값을 찍는다

 

 

C++판 nameof

#define NAMEOF(name) #name
void setup() {
  Serial.begin(9600);        // Initialize serial communications with the PC

  int frequency=768;
    Serial.print(__func__); //setup
    Serial.print(NAMEOF(frequency)); //frequency
}

__func__ 가 함수명이고

NAMEOF는 define으로 선언해주어야 한다

완벽히 동일한 기능을 하는건 아니고 잘못된 값을 넣어도 잘만 컴파일 된다. IDE에서 이름확인하는데에만 쓰자

define 원래 용도가 이건데 매크로같은 용도이다.

자세한건

https://dev.to/tomoyukiaota/exploring-c-equivalent-of-cs-nameof-operator-1p8c

http://www.cplusplus.com/forum/beginner/206693/

두곳을 참조하자

 

 

 

 

 

 

 

 

 

 

 

EEPROM

어드레스 0~512

값 0~255

#include <EEPROM.h>

int index=0;
int indexAddress=0;
void Read()
{
  index = EEPROM.read(indexAddress);
}
void Save()
{
    EEPROM.write(indexAddress, index);
}

 

 

 

 

 

 

 

 

 

 

c++

'아두이노' 카테고리의 다른 글

아두이노 헤더 예제  (0) 2021.07.15
byte to hex  (0) 2021.02.23
아두이노 RC522 (RFID 13.56MHz)  (0) 2020.11.12
posted by 모카쨩
2021. 2. 23. 15:12 아두이노
  byte _buffer = 252;
  int hexUpper = _buffer/16;
  int hexLower = _buffer%16;
  char hexUpperChar = hexUpper>=10? 'A' + hexUpper-10 : '0' + hexUpper;
  char hexLowerChar = hexLower>=10? 'A' + hexLower-10 : '0' + hexLower;
  String hexString = String(hexUpperChar)+String( hexLowerChar);
  Serial.println(hexString);

 


if(_buffer<16)
{
  Serial.print("0");
}
Serial.println(_buffer,HEX);

 

 

16진수

'아두이노' 카테고리의 다른 글

자주쓰는 아두이노 코드 모음  (0) 2021.06.21
아두이노 RC522 (RFID 13.56MHz)  (0) 2020.11.12
블루투스 테스트용 앱들  (0) 2020.08.01
posted by 모카쨩
2020. 11. 12. 13:43 아두이노

rc522는 RFID모듈이다 2020년 기준 국내 1000~2000가격에 구할수 있다

 

 

NFC랑 RFID랑 다른것 같다. 뭔차인진 몰겄고 걍 작동만 되면 된다

 

 

 

 

다음 표를 보면서 핀을 넣는다

주의할점은 IRQ는 사용 안함이고 핀순서가 뒤죽박죽이기 때문에 기판에 인쇄된 글자를 보면서 해야한다

 

 

 

결과

 

 

 

카드의 값을 읽어올때는 DumpInfo예제를 쓴다

 

결과

 

 

PCD_Authenticate() failed: Error in communication. 에러는 일반적으로 암호화된 블록을 키없이 읽으려고 할때 발생한다.

읽기 키 기본값은 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF이고 키를 변경하면 키를 가진사람외에는 읽기 방지 할 수있다.

 

 

보통은 이걸 바꾼다

MFRC522::MIFARE_Key key;

void setup() {
    for (byte i = 0; i < 6; i++) {
        key.keyByte[i] = 0xFF;
    }
    }

 

 

A MIFARE PICC responded with NAK.

은 쓰기방지가 걸려있는거다. 다른 섹터, 혹은 블록을 참조해야한다고했는데 알고보니 트레일러가 잘못된거였다

 

 

 

 

함수모음

    //카드접촉검사
    if ( ! mfrc522.PICC_IsNewCardPresent())
        return;

    //카드읽기가 정상인지 검사
    if ( ! mfrc522.PICC_ReadCardSerial())
        return;

 

 

데이터블록은 blockAddr/4*4+3이여야 한다

혹은 blockAddr-(blockAddr%4)+3

즉 1이면 3, 4이면7, 5여도 7 

    byte sector         = 1;
    byte sector2         = 0;
    
    byte blockAddr      = 1;
    byte dataBlock[]    = {
        0x01, 0x02, 0x03, 0x04, //  1,  2,   3,  4,
        0x05, 0x06, 0x07, 0x08, //  5,  6,   7,  8,
        0x09, 0x0a, 0xff, 0x0b, //  9, 10, 255, 11,
        0x0c, 0x0d, 0x0e, 0x0f  // 12, 13, 14, 15
    };
    byte trailerBlock   = blockAddr/4*4+3;

 

데이터시트

www.nxp.com/docs/en/data-sheet/MF1S50YYX_V1.pdf

 

0번섹터 0번블록은 UID등등의 값이 들어가있고 Manufacture Block이라고 한다

503번RFID는

0~3바이트는 NUID

500번RFID는

0~5바이트는 UID

 

각 섹터별 3번블록은 섹터정보가 있는지 함부로 값을쓰면 개박살난다

 

 

 

 


  byte sectorTrailerBuffer[16]={0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x07,0x80,0x69,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};

block=1;

      byte sectorTrailerIndex = block/4*4+3;
      
      
      //해당 블록에 액세스
      
      status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, sectorTrailerIndex, &key, &(mfrc522.uid));
      if (status == MFRC522::STATUS_OK) 
      {
        Serial.println(F("PCD_Authenticate() success: "));
      }
      else 
      {
        Serial.print(F("PCD_Authenticate() failed: "));
        Serial.println(mfrc522.GetStatusCodeName(status));
        return;
      }
      
      
      
  
  if(block==sectorTrailerIndex)
      {
      if(useAkey)
      {
//A값
[0 0 1]
  mfrc522.MIFARE_SetAccessBits(&sectorTrailerBuffer[6], 0, 0, 0, 1); 
      }
      else
      {
//B값
[0 1 1]
  mfrc522.MIFARE_SetAccessBits(&sectorTrailerBuffer[6], 3, 3, 3, 3); 
      }
      
  
        status = mfrc522.MIFARE_Write(block, sectorTrailerBuffer, 16);
      }
      else
      {
        status = mfrc522.MIFARE_Write(block, buffer, 16);
      }
      
  
    
    if (status == MFRC522::STATUS_OK) 
    {
      Serial.println(F("MIFARE_Write() success: "));
    }
    else 
    {
      Serial.print(F("MIFARE_Write() failed: "));
      Serial.println(mfrc522.GetStatusCodeName(status));
      return;
    }
  
  
  
  

'아두이노' 카테고리의 다른 글

byte to hex  (0) 2021.02.23
블루투스 테스트용 앱들  (0) 2020.08.01
블루투스 셋업용 코드  (0) 2020.07.31
posted by 모카쨩
2020. 8. 1. 12:17 아두이노

 

 

터미널 테스트시 사용

HC-06

HM-10

Serial Bluetooth Terminal (최종확인 2020,2022년)

https://play.google.com/store/apps/details?id=de.kai_morich.serial_bluetooth_terminal

 

Serial Bluetooth Terminal - Google Play 앱

'Serial Bluetooth Terminal' is a line-oriented terminal / console app for microcontrollers, arduinos and other devices with a serial / UART interface connected with a bluetooth to serial converter to your android device. This app supports different bluetoo

play.google.com

 

 

UUID 화인할때 사용

HM-10

BLE Scanner (Connect & Notify)

https://play.google.com/store/apps/details?id=com.macdom.ble.ble

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

블루투스 기기별 커맨드

https://wmmu.tistory.com/entry/%EB%B8%94%EB%A3%A8%ED%88%AC%EC%8A%A4-%EA%B8%B0%EA%B8%B0%EB%B3%84-%EC%BB%A4%EB%A7%A8%EB%93%9C

 

 

블루투스 셋업용코드

https://wmmu.tistory.com/entry/%EB%B8%94%EB%A3%A8%ED%88%AC%EC%8A%A4-%EC%85%8B%EC%97%85%EC%9A%A9-%EC%BD%94%EB%93%9C

'아두이노' 카테고리의 다른 글

아두이노 RC522 (RFID 13.56MHz)  (0) 2020.11.12
블루투스 셋업용 코드  (0) 2020.07.31
아두이노 키패드  (0) 2020.07.30
posted by 모카쨩
2020. 7. 31. 01:26 아두이노

 

 

HC-05

#include <SoftwareSerial.h>
 
SoftwareSerial btSerial(2, 3); //2번을 블투의 TX에 꼽고 3번을 RX에 꼽을것
void setup()  
{
    Serial.begin(9600);
    btSerial.begin(38400); 
}
 
void loop()
{
  if (btSerial.available()) 
  {
    Serial.write(btSerial.read());
  }
  if (Serial.available()) 
  {
    btSerial.write(Serial.read());
  }
}

 

HC-06

#include <SoftwareSerial.h>
 
SoftwareSerial btSerial(2, 3);//2번을 블투의 TX에 꼽고 3번을 RX에 꼽을것
void setup() 
{
  Serial.begin(9600);
  btSerial.begin(9600);
}
void loop()
{
  if (btSerial.available()) 
  {       
    Serial.write(btSerial.read()); 
  }
  if (Serial.available()) 
  {         
    btSerial.write(Serial.read()); 
  }
}

 

HM-10 (Both NL & CR 사용)

#include <SoftwareSerial.h>
 
SoftwareSerial btSerial(2, 3);//2번을 블투의 TX에 꼽고 3번을 RX에 꼽을것
void setup() 
{
  Serial.begin(9600);
  btSerial.begin(9600);
  Serial.println("Start"); 
}
void loop()
{
  if (btSerial.available()) 
  {       
    Serial.write(btSerial.read()); 
  }
  if (Serial.available()) 
  {         
    btSerial.print(Serial.readString()); 
    Serial.print(Serial.readString()); 
  }
}

 

HM-10 (Both NL & CR 사용) 아두에노 메가용


 //19번을 블투의 TX에 꼽고 18번을 RX에 꼽을것 (위아래가 거꾸로 쓰임)
void setup() 
{
  Serial.begin(9600);
  Serial1.begin(9600);
  Serial.println("Start"); 
}
void loop()
{
  if (Serial1.available()) 
  {       
    Serial.write(Serial1.read()); 
  }
  if (Serial.available()) 
  {         
    Serial1.print(Serial.readString()); 
    Serial.print(Serial.readString()); 
  }
}

 

블루투스 기기별 커맨드

https://wmmu.tistory.com/entry/%EB%B8%94%EB%A3%A8%ED%88%AC%EC%8A%A4-%EA%B8%B0%EA%B8%B0%EB%B3%84-%EC%BB%A4%EB%A7%A8%EB%93%9C

 

 

블루투스 테스트용 앱들

https://wmmu.tistory.com/search/HC-06

 

 

'아두이노' 카테고리의 다른 글

블루투스 테스트용 앱들  (0) 2020.08.01
아두이노 키패드  (0) 2020.07.30
아두이노 Due 설치방법  (0) 2020.06.27
posted by 모카쨩
2020. 7. 30. 23:46 아두이노

 

 

 

 

 

 

 

 

 

#include <Keypad.h>
 
const byte ROWS = 4;    // 행(rows) 개수
const byte COLS = 4;    // 열(columns) 개수
char keys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
 
byte rowPins[ROWS] = {6, 7, 8, 9};   // R1, R2, R3, R4 단자가 연결된 아두이노 핀 번호
byte colPins[COLS] = {5, 4, 3, 2};   // C1, C2, C3, C4 단자가 연결된 아두이노 핀 번호
 //키패드를 정면에서 봤을때 오른쪽핀이 2번임
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
 
void setup() {
  Serial.begin(9600);
}
   
void loop() {
  char key = keypad.getKey();
   
  if (key) {
    Serial.println(key);
  }
}

 

 

 

 

 

 

 

 

'아두이노' 카테고리의 다른 글

블루투스 셋업용 코드  (0) 2020.07.31
아두이노 Due 설치방법  (0) 2020.06.27
자이로 좌표계  (0) 2018.02.17
posted by 모카쨩
2020. 6. 27. 19:36 아두이노

요샌 기본적으로 꼽기만 해도 자동설치되지만 가끔 수동설치해야한다

 

 

 

 

 

 

due로 검색하면 더 잘나온다

 

 

 

다운로드가 끝난후 30초정도 기다리면 뜬다

안보일경우에 아래쪽도 참고

 

 

프로그래밍 포트는 일반적으로 왼쪽이고 오른쪽은 그렇게 업로드한걸 받을때 쓴다. 키보드라던지

'아두이노' 카테고리의 다른 글

아두이노 키패드  (0) 2020.07.30
자이로 좌표계  (0) 2018.02.17
attiny 쓰기  (0) 2018.02.11
posted by 모카쨩

저사양 유저용 블로그 진입