Get it on Google Play


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

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

Recent Comment

Archive


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 모카쨩
2018. 2. 17. 00:12 아두이노

6050

 

좌표

위(0,0,-1)

앞(0,-1,0)

오른쪽(-1,0,0)

 

??시계각도계(좌표평면기준)

반시계각도계(좌표축기준)

 

좌표가 전부 반대방향이니 주의

이렇게 놓으면 유니티랑 똑같음

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

아두이노 Due 설치방법  (0) 2020.06.27
attiny 쓰기  (0) 2018.02.11
각도 계산 스크립트  (0) 2017.10.20
posted by 모카쨩

  • total
  • today
  • yesterday

Recent Post

저사양 유저용 블로그 진입