JH7UBCブログ

アマチュア無線 電子工作 家庭菜園など趣味のブログです

hp 15-af100のメモリ増設

2020-02-15 12:39:31 | パソコン

 先日、HDDからSSDに交換したノートパソコンhp 15-af100のメモリを増設しました。(HDD→SSD交換の記事はこちら

 パソコンの立ち上がりやアプリの立ち上がりは、かなり速くなりましたが、この際もともと4GBのRAMを4GB増設して倍の8GBにしてみようと思います。

 15-af100のメモリは、DDR3L1600タイプです。Amazonから比較的値段の安い中古のキングトン4GBを購入しました。

 検品済のステッカが貼ってあります。大丈夫でしょう。

 パソコンのビスを全部外して、下部カバーを取り外します。方法はこちらのサイトを参照ください。

 下部カバーをはずした状態です。

 空いているメモリスロットに購入したメモリを装着します。

 切り欠き部分を合わせて、メモリボードを押し込むと、カチャという音がして、金具で固定されます。

 黄色い丸印が新たに装着した4GBメモリです。

 下部カバーを元通りに戻して、電源ON。

 ウインドーズロゴで右クリックして、「システム」を開くと、確かにメモリが8GBになっています。

 簡単にRAMの増設ができました。ただし、メーカーは保証していませんので、これによって生じたトラブルは、自己責任です。

 hp 15-af100は、4万円を切る程度の格安パソコンです。CPUが非力ですから、HDD→SSD交換とRAMを増設しても、処理速度は変わりません。しかし、パソコンの立ち上がり、終了、アプリの立ち上げ、終了、IMEによる変換、多数のアプリを立ち上げたときの切り替えなど、全体に動きがよくなり、ストレスが少なくなりました。

 日常使いのパソコンとして、もう少し頑張ってもらいましょう。

 


ESP32 Si5351A テスト

2020-02-11 17:33:52 | ESP32

 ESP32で、3チャンネルクロックジェネレータSi5351Aをコントロールするテストです。

 Si5351Aのコントロールの仕方は、JH7UBCホームページのArduinoのページのこちらで解説しています。

 Arduino用のスケッチをESP32に書き込んでみると何の問題もなく動作しました。

 そこで、「Si5351Aの実験その3(マルチチャンネル化)」のスケッチを書き込んでみました。

 CLK0に1MHzをCLK1に10MHzをCLK2に5MHzを出力します。

 ESP32とSi5351A(秋月電子のモジュール)との接続は、次のようにします。

 (I2Cのプルアップ抵抗10kΩは、つけなくとも動作しました。)

スケッチです。

---------------------------------------

/*
 * ESP32 Si5351A test2
 * 2020.02.11
 * JH7UBC Keiji Hata 
 * マルチチャンネル出力の実験
 * CLK0=1MHz
 * CLK1=10MHz
 * CLK2=5MHz
 */
 
#include

#define Si5351A_ADDR 0x60
#define MSNA_ADDR 26
#define MSNB_ADDR 34
#define MS0_ADDR 42
#define MS1_ADDR 50
#define MS2_ADDR 58
#define CLK0_CTRL 16
#define CLK1_CTRL 17
#define CLK2_CTRL 18
#define OUTPUT_CTRL 3
#define XTAL_LOAD_C 183
#define PLL_RESET 177
uint32_t frequency;
const uint32_t XtalFreq = 25000000;

uint32_t P1;
uint32_t P2;
uint32_t P3;
uint32_t PllFreq;
uint32_t l;
float f;
uint8_t mult;
uint32_t num;
uint32_t denom;
uint32_t divider;
char PLL;
uint8_t PLL_ADDR;
uint8_t MS_ADDR;


void setup(){
Wire.begin();
Si5351_init(); //Si5351Aの初期化

//PLLA=900MHz,CLK0=1MHz
frequency = 1000000;
divider = 900000000 / frequency;
if (divider % 2) divider--;
PLL_Set('A',frequency,divider);
Si5351_write(CLK0_CTRL,0x4C); //CLK0 Sorce PLLA
MS_Set(0,divider);

//PLLB=900MHz
frequency = 10000000;
divider = 900000000 / frequency;
if (divider % 2) divider--;
PLL_Set('B',frequency,divider);

//CLK1=10MHz
Si5351_write(CLK1_CTRL,0x6C); //CLK1 Sorce PLLB
MS_Set(1,divider);

//CLK2=5MHz
Si5351_write(CLK2_CTRL,0x6C); //CLK2 Sorce PLLB
divider=divider*2;
MS_Set(2,divider);
}

void loop(){

}

//Si5351のレジスタに1バイトデータを書き込む。
void Si5351_write(byte Reg , byte Data)
{
Wire.beginTransmission(Si5351A_ADDR);
Wire.write(Reg);
Wire.write(Data);
Wire.endTransmission();
}

//Si5351Aの初期化
void Si5351_init(){
  Si5351_write(OUTPUT_CTRL,0xFF); //Disable Output
  Si5351_write(CLK0_CTRL,0x80); //CLOCK0 Power down
  Si5351_write(CLK1_CTRL,0x80); //CLOCK1 Power down
  Si5351_write(CLK2_CTRL,0x80); //CLOCK2 Power down 
  Si5351_write(XTAL_LOAD_C,0x92); //Crystal Load Capasitance=8pF
  Si5351_write(PLL_RESET,0xA0); //Reset PLLA and PLLB
  Si5351_write(CLK0_CTRL,0x4F); //CLOCK0 Power up
  Si5351_write(CLK1_CTRL,0x4F); //CLOCK0 Power up
  Si5351_write(CLK2_CTRL,0x4F); //CLOCK0 Power up 
  Si5351_write(OUTPUT_CTRL,0xF8); //Enable CLOCK0,CLOCK1,CLOCK2
}


//PLLの設定
void PLL_Set(char Pll,uint32_t Freq,uint32_t Div){
  PllFreq = Div * Freq;
  mult = PllFreq / XtalFreq;
  l = PllFreq % XtalFreq;
  f = l;
  f *= 1048575;
  f /= XtalFreq;
  num = f;
  denom = 1048575;

  P1 = (uint32_t)(128 * ((float)num /(float)denom));
  P1 = (uint32_t)(128 * (uint32_t)(mult) + P1 - 512);
  P2 = (uint32_t)(128 * ((float)num / (float)denom));
  P2 = (uint32_t)(128 * num -denom * P2);
  P3=denom;

  if (Pll == 'A')
    {
    PLL_ADDR = MSNA_ADDR;
    }else
    {
    PLL_ADDR = MSNB_ADDR;
  }
  Parameter_write(PLL_ADDR,P1,P2,P3);
}

//MultiSynth(分周器)のセット
void MS_Set(uint8_t MS_No,uint32_t Div){
  P1 = 128 * Div - 512;
  P2 = 0;
  P3 = 1;
  switch(MS_No){
    case 0:
    MS_ADDR = MS0_ADDR;
    break;
    case 1:
    MS_ADDR = MS1_ADDR;
    break;
    case 2:
    MS_ADDR = MS2_ADDR;
    break;
    default:
    MS_ADDR = MS0_ADDR;
  }
  Parameter_write(MS_ADDR,P1,P2,P3); 
}

//レジスタにパラメータP1,P2,P3を書き込む。
void Parameter_write(uint8_t REG_ADDR,uint32_t Pa1,uint32_t Pa2,uint32_t Pa3)
{
  Si5351_write(REG_ADDR + 0,(Pa3 & 0x0000FF00) >> 8);
  Si5351_write(REG_ADDR + 1,(Pa3 & 0x000000FF));
  Si5351_write(REG_ADDR + 2,(Pa1 & 0x00030000) >> 16);
  Si5351_write(REG_ADDR + 3,(Pa1 & 0x0000FF00) >> 8);
  Si5351_write(REG_ADDR + 4,(Pa1 & 0x000000FF));
  Si5351_write(REG_ADDR + 5,((Pa3 & 0x000F0000) >> 12) | ((Pa2 & 0X000F0000) >> 16));
  Si5351_write(REG_ADDR + 6,(Pa2 & 0x0000FF00) >> 8);
  Si5351_write(REG_ADDR + 7,(Pa2 & 0x000000FF)); 
}

---------------------------------------

水晶の負荷容量は、8pFにしていますが、設定周波数より若干低い周波数を発生します。

CLK0 1MHzです。

CLK1 10MHzです。

CLK2 5MHzです。


ESP32 HC-SR04による距離の測定

2020-02-10 11:39:33 | ESP32

 ESP32で超音波センサーHC-SR04を使って距離を測定するテストです。

 原理はmicro:bitで行った実験と同じです。簡単な説明の図です。

スケッチです。測定した距離はシリアルモニタにcm単位で表示します。

HC-SR04に送るトリガーパルスの幅は10usです。

---------------------------------------

/*
 * ESP32 HC-SR04による距離の測定
 * 2020.2.10
 * JH7UBC Keiji Hata
 */

#define Trigger_Pin 17
#define Echo_Pin 16
int V = 340;//音速

void setup() {
  Serial.begin(115200);
  pinMode(Trigger_Pin, OUTPUT);
  pinMode(Echo_Pin, INPUT);
  digitalWrite(Trigger_Pin, LOW);
}

//Send Trigger pulse
void sendTrigger(){
  digitalWrite(Trigger_Pin,HIGH);
  delayMicroseconds(10);
  digitalWrite(Trigger_Pin, LOW);
}

void loop() {
  sendTrigger();

  while(!digitalRead(Echo_Pin)){ 
  }
  unsigned long t1 = micros();

  while(digitalRead(Echo_Pin)){
  }
  unsigned long t2 = micros();
  unsigned long t = t2 - t1;
  Serial.print(V * t /20000);
  Serial.println("cm");
  delay(1000);
}

---------------------------------------

測定の様子です。

 micro:bitの時と同様に1mくらいまでは、けっこう正確に距離を測定できますが。1mを超えたあたりから測定値のばらつきが大きくなります。


ESP32 NTP 時計

2020-02-09 12:46:22 | ESP32

 ESP32でWiFi接続ができましたので、NTP(Netwaork Time Protocol)サーバーから時刻の情報を取得して、LCDに表示するNTP時計を作ってみます。

 NTPサーバーから時刻情報を取得するスケッチは、Autumn-Color.comというサイトのスケッチをコピーさせていただきました。このスケッチでは、Arduino IDEのシリアルモニタに時刻を表示させています。

 コピペしてESP32-DevKitCで実行してみると

年/月/日(曜日)時:分:秒が1秒ごとに表示されます。

これをLCDに表示してみます。

LCDは、1602(16文字2行)ですので、1行では入りきりませんので、

1行目に年/月/日(曜日)を表示して、2行目に時:分:秒を表示することにします。

LCDは、I2C用を使いましたのでESP32-DevKitCとの接続は、次のようにします。

スケッチです。「your SSID」、「your password」には自宅のWiFiのSSIDとパスワードを入れてます。

-------------------------------------------

/*
 * ESP32 NTP Clock I2C LCD Display
 * 2020.02.08
 * JH7UBC Keiji Hata
 */
 
#include <WiFi.h>
#include <time.h>
#include <LiquidCrystal_I2C.h>
 
// set the LCD
int lcdColumns = 16;
int lcdRows = 2;
LiquidCrystal_I2C lcd(0x27, lcdColumns, lcdRows);
 
#define JST     3600* 9
// set WiFi ssid & password
const char* ssid = "your SSID";
const char* password = "your passwaord";
 
void setup() {
  // initialize LCD
  lcd.init();
  // turn on LCD backlight                     
  lcd.backlight();
  //WiFi set up
  WiFi.begin(ssid, password);
  while(WiFi.status() != WL_CONNECTED) {
    lcd.print(".");
    delay(500);
  }
  lcd.clear();
  lcd.print("Connected");
  lcd.setCursor(0, 1);
  lcd.print("IP:");
  lcd.print(WiFi.localIP());
  delay(1000);
  lcd.clear();
  configTime( JST, 0, "ntp.nict.jp", "ntp.jst.mfeed.ad.jp");
}
 
void loop() {
  time_t t;
  struct tm *tm;
  static const char *wd[7] = {"Sun","Mon","Tue","Wed","Thr","Fri","Sat"};
 
  t = time(NULL);
  tm = localtime(&t);
  lcd.home();
  lcd.printf("%04d/%02d/%02d(%s)",tm->tm_year+1900, tm->tm_mon+1, tm->tm_mday,wd[tm->tm_wday]);
  lcd.setCursor(0,1);
  lcd.printf("%02d:%02d:%02d",tm->tm_hour, tm->tm_min, tm->tm_sec);
  delay(1000);
}

-------------------------------------------

configTime()は、NTPサーバーに接続する関数、getlocalTime()は時刻情報を取得する関数で、説明は「Arduinoで遊ぶページ」のこちらのページが参考になりました。

WiFiに接続すると、1行目に「Connected」、2行目にIPアドレスが表示されます。

その後、日付と時刻が表示されます。


ESP32 Bluetooth テスト

2020-02-07 08:10:53 | ESP32

 WiFiに続いてESP32のBluetoothのテストをします。

 テストのための簡単なスケッチをESP32にコンパイル書き込みをします。

  「Hello World!」の文字をESP32側からパソコンにシリアル送信し、パソコンでそれを受信して、表示するスケッチです。

-------------------------------------------

#include "BluetoothSerial.h"

BluetoothSerial SerialBT;

void setup() {
  SerialBT.begin("ESP32test"); //Bluetooth device name
}

void loop() {
  SerialBT.println("Hello World!");
  delay(1000);
}

-------------------------------------------

 ESP32とパソコンをBluetooth接続する必要があります。(したがって、Bluetooth機能を持っていないパソコンではできません。)

 ESP32に電源が入った状態でパソコン(Windows10)側からBluetooth接続(ペアリング)の設定をします。

 Windows10のウインドウズロゴ→設定→デバイス(Bluetoothとその他のデバイス)と進み

 「Bluetoothまたはその他のデバイスを追加する」をクリックするとESP32のBluetoothが検出されます。

この場合、ESP32testを選ぶ(クリック)すると接続(ペアリング)が完了します。

ペアリングが完了するとパソコン側に新たなシリアルポート(COMポート)が開かれます。

ウインドウズロゴで右クリックして、デバイスマネージャーを開きます。

 ESO32に接続してるシリアルポート(この場合COM4)の他にBluetooth経由の標準シリアルCOM5とCOM6が新たに加わっています。

 Arduino IDEでツール→シリアルポートでCOM6を選び、シリアルモニタを開くとESP32からシリアル通信で送信された「Hello World!」の文字列を1秒ごとに受信し表示されます。(通信速度は115200bpsにします)

 ここで、ちょっとした注意が必要です。ESP32とパソコンとの通信には、COM6を使っていますが、ESP32にスケッチを書き込むには、Arduino IDEのシリアルポートを本来のESP32とパソコンの接続(この場合COM4)に戻す必要があります。

 Bluetooth接続は単なるシリアル通信ですから、TeraTermなどの通信ソフトでもESP32と通信することができます。

 TeraTermで受信した画面です。

 ESP32とパソコン間でBluetooth接続(ペアリング)ができ、通信できることが確認できましたので、パソコンからの指示でESP32に接続したLEDを点灯、消灯するスケッチを試してみます。

 スケッチです。

------------------------------------------

#include "BluetoothSerial.h"
#define LED_Pin 27

BluetoothSerial SerialBT;

void setup() {
  SerialBT.begin("ESP32test"); //Bluetooth device name
  Serial.begin(115200);
  pinMode(LED_Pin, OUTPUT);
  digitalWrite(LED_Pin, LOW);
}

void loop() {
  if (SerialBT.available()){
    char C = SerialBT.read();
    if(C == '1'){
      digitalWrite(LED_Pin, HIGH);
      SerialBT.println("LED ON");
    }else if(C == '2'){
      digitalWrite(LED_Pin,LOW);
      SerialBT.println("LED OFF");
    }
  }
}

------------------------------------------

スケッチを書き込み、COM6でシリアルモニタを開き、「1」を送信するとLEDが点灯します。「2」を送信するとLEDは消灯します。ESP32からは、「LED ON」「LED OFF」といいう文字が送られてきます。

動作を確認することができました。

Bluetoothは、WiFiより簡単に通信することができます。近距離でロボットなどを制御するには便利なのではないでしょうか。